1.
1 |
show full processlist; |
使用上面的命令可以查询当前SQL语句的信息,其中包括运行时间。
2.
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> explain select * from tickets\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tickets type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4 Extra: |
在select语句前面添加explain可以查看SQL语句的查询执行计划(QEP), 根据此结果,可以查看SQL语句执行的相关信息。
key:索引的信息,NULL指没有索引。
rows:查询影响的行数。
3.
1 2 |
show create table table_name\G show table status like table_name\G |
SQL语句优化之前,首先执行上面的两个命令,对表结构做检查。
show table status命令可以查看数据库表的底层大小以及表结构,其中包括存储引擎类型,版本,数据和索引大小,行的平均长度以及行数。如果是InnoDB引擎,值为估计值并且可能有很大的误差。
4.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
mysql> explain extended select * from tickets\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tickets type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4 filtered: 100.00 Extra: 1 row in set, 1 warning (0.00 sec) mysql> show warnings\G *************************** 1. row *************************** Level: Note Code: 1003 Message: select `test`.`tickets`.`tid` AS `tid`,`test`.`tickets`.`aid` AS `aid`,`test`.`tickets`.`tTitle` AS `tTitle`,`test`.`tickets`.`tContent` AS `tContent`,`test`.`tickets`.`tType` AS `tType`,`test`.`tickets`.`tRemark` AS `tRemark`,`test`.`tickets`.`tHasSubTicket` AS `tHasSubTicket`,`test`.`tickets`.`tsid` AS `tsid`,`test`.`tickets`.`tCreated` AS `tCreated`,`test`.`tickets`.`tUpdated` AS `tUpdated`,`test`.`tickets`.`tDeleted` AS `tDeleted`,`test`.`tickets`.`tStatus` AS `tStatus` from `test`.`tickets` 1 row in set (0.00 sec) |
explain 的extended 扩展能够在原本explain的基础上额外的提供一些查询优化的信息,这些信息可以通过mysql的show warnings命令得到。上面可以看到select * 被优化了。
5.
1 |
mysqldump -uroot -p --no-data -e test tickets > tmp/ticket.sql |
mysqldump工具能够快速生成用户模式或数据库实例中所有表的定义。
-e 是数据库名称,tickets 是表名。–no-data 指的是不导出表的数据。
通过cat tmp/ticket.sql 查看相关表结构。
6.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mysql> flush status; Query OK, 0 rows affected (0.00 sec) mysql> select count(*) from wp_posts where post_parent !=0\G *************************** 1. row *************************** count(*): 30 1 row in set (0.00 sec) mysql> show session status like 'handler_read%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Handler_read_first | 1 | | Handler_read_key | 1 | | Handler_read_next | 30 | | Handler_read_prev | 0 | | Handler_read_rnd | 0 | | Handler_read_rnd_next | 0 | +-----------------------+-------+ 6 rows in set (0.00 sec) |
Handler_read_first 代表读取索引头的次数,如果这个值很高,说明全索引扫描很多。
Handler_read_key代表一个索引被使用的次数,如果我们新增加一个索引,可以查看Handler_read_key是否有增加,如果有增加,说明sql用到索引。
Handler_read_next 代表读取索引的下列,一般发生range scan。
Handler_read_prev 代表读取索引的上列,一般发生在ORDER BY … DESC。
Handler_read_rnd 代表在固定位置读取行,如果这个值很高,说明对大量结果集进行了排序、进行了全表扫描、关联查询没有用到合适的KEY。
Handler_read_rnd_next 数值越大,代表进行了很多表扫描,查询性能低下。