1.查看数据表的状态
mysql> show table status like 'zero_admin'\G *************************** 1. row *************************** Name: zero_admin (表名) Engine: InnoDB (存储引擎) Version: 10 Row_format: Compact (行格式。对于MyISAM引擎,这可能是Dynamic,Fixed或Compressed。动态行的行长度可变, 例如Varchar或Blob类型字段。固定行是指行长度不变,例如Char和Integer类型字段。) Rows: 0 (表中的行数。对于非事务性表,这个值是精确的,对于事务性引擎,这个值通常是估算的。) Avg_row_length: 0 (平均每行包括的字节数 ) Data_length: 16384 (整个表的数据量(单位:字节)) Max_data_length: 0 (表可以容纳的最大数据量) Index_length: 16384 (索引占用磁盘的空间大小 ) Data_free: 6291456 (对于MyISAM引擎,标识已分配,但现在未使用的空间,并且包含了已被删除行的空间。) Auto_increment: 2 (下一个Auto_increment的值) Create_time: 2015-10-26 08:19:08 (表的创建时间) Update_time: NULL (表的最近更新时间) Check_time: NULL (使用 check table 或myisamchk工具检查表的最近时间) Collation: utf8_general_ci (表的默认字符集和字符排序规则) Checksum: NULL (如果启用,则对整个表的内容计算时的校验和) Create_options: (指表创建时的其他所有选项) Comment: 管理员表 (包含了其他额外信息,对于MyISAM引擎,包含了注释徐标新,如果表使用的是innodb引擎 , 将现实表的剩余空间。如果是一个视图,注释里面包含了VIEW字样。) 1 row in set (0.00 sec)
2.执行计划
mysql> explain select * from zero_admin\G *************************** 1. row *************************** id: 1 (主键ID) select_type: SIMPLE (simple 它表示简单的select,没有union和子查询) table: zero_admin (表名) type: ALL (连接类型,此处因该表中只有一条记录,所以mysql改成了全表扫描) possible_keys: NULL (可能会被用到的索引) key: NULL (实际使用的索引) key_len: NULL (MYSQL使用的索引长度) ref: NULL (ref列显示使用哪个列或常数与key一起从表中选择行) rows: 1 (显示MYSQL执行查询的行数,数值越大越不好,说明没有用好索引) Extra: (该列包含MySQL解决查询的详细信息) 1 row in set (0.00 sec)
3.查看mysql的状态,或登录mysql后show status;主要看下面三个参数;
[pikaqiu@bogon ~]$ mysqladmin -uroot -p001020 ext | Variable_name | Value | | Queries | 299 |#目前总共发生了多少次查询 | Threads_running | 1 |#目前正在运行的线程数 | Threads_connected | 1 |#目前正在连接的线程数
4.利用awk将mysql的状态显示出来;
[root@bogon pikaqiu]# mysqladmin -uroot -p001020 ext|awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}'
474 1 1
5.可以用shell将mysql每秒的状态写入一个文件,然后用awk整理出每秒的查询数及连接线程数;(awk '{q=$1-last;$last=$1}{printf("%d $d $d\n",q,$2,$3)}');
6.查看数据库状态;
[pikaqiu@bogon ~]$ mysql -uroot -p001020 -e 'show processlist\G' *************************** 1. row *************************** Id: 1 User: system user Host: db: NULL Command: Connect Time: 212 State: Connecting to master Info: NULL *************************** 2. row *************************** Id: 12 User: root Host: localhost db: NULL Command: Query Time: 0 State: init Info: show processlist
7.可以写一个shell脚本记录mysql的state,如果观察到以下状态,则需要注意
converting HEAP to MyISAM 查询结果太大时,把结果放在磁盘 (语句写的不好,取数据太多) create tmp table 创建临时表(如group时储存中间结果,说明索引建的不好) Copying to tmp table on disk 把内存临时表复制到磁盘 (索引不好,表字段选的不好) locked 被其他查询锁住 (一般在使用事务时易发生,互联网应用不常发生) logging slow query 记录慢查询
8.5.5以后的版本可以打开profiling变量以记录sql的执行速度并对sql进行分析,show profile for query 3该命令将列出该语的所有执行步骤和执行时间;(记录只对当前客户端有效)
mysql> set profiling=on; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'profiling'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | profiling | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> select title from test1 where id<200; ERROR 1046 (3D000): No database selected mysql> select title from test.test1 where id<200; +---------+ | title | +---------+ | 4907186 | | 1414279 | ...... | 3621620 | +---------+ 199 rows in set (1 min 0.41 sec) mysql> show profiles; +----------+-------------+-------------------------------------------+ | Query_ID | Duration | Query | +----------+-------------+-------------------------------------------+ | 1 | 0.00137775 | show variables like 'profiling' | | 2 | 0.00012400 | select title from test1 where id<200 | | 3 | 60.40529475 | select title from test.test1 where id<200 | +----------+-------------+-------------------------------------------+ 3 rows in set (0.00 sec) mysql> show profile for query 3; +----------------------+-----------+ | Status | Duration | +----------------------+-----------+ | starting | 0.000107 | | checking permissions | 0.000018 | | Opening tables | 0.386308 | | System lock | 0.000053 | | init | 0.000041 | | optimizing | 0.000021 | | statistics | 0.044066 | | preparing | 0.000054 | | executing | 0.000010 | | Sending data | 59.974486 | | end | 0.000020 | | query end | 0.000009 | | closing tables | 0.000063 | | freeing items | 0.000032 | | logging slow query | 0.000005 | | cleaning up | 0.000005 | +----------------------+-----------+ 16 rows in set (0.36 sec)
9.查看锁争用情况 show status like 'table_lock%';
10.查看引擎 show engines;
11.查看创建表的状况 show create table tablename;
12.给表(myisam)加锁 lock tables tablename write/read local
13.给表(myisam)解锁 unlock tables;
14.给数据集(innodb 行) 加排他锁/共享锁 select *** for update/lock in share mode
15.查看当前回话的隔离级别select @@tx_isolation;
16.查看系统隔离界别 select @@global.tx_isolation
17.设置当前回话隔离级别set session transaction isolation level xxx
18.设置系统的隔离级别set global transaction isolation level xxx