通过explain语句,查看sql使用索引情况
explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
通过例子看看explain怎么用。
表结构如下
+——-+———-+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+—————-+
| ID | int(1) | NO | PRI | NULL | auto_increment |
| Score | char(20) | YES | | NULL | |
| Name | char(20) | YES | | NULL | |
| Class | char(20) | YES | | NULL | |
+——-+———-+——+—–+———+—————-+
执行:
EXPLAIN SELECT * FROM a
WHERE id = ‘1’
结果如下:
+——+————-+——-+——-+—————+———+———+——-+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+——+————-+——-+——-+—————+———+———+——-+——+——-+
| 1 | SIMPLE | a | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+——+————-+——-+——-+—————+———+———+——-+——+——-+
- select_type
查询类型,它有一下几种值:
- simple 表示简单的select,没有union和子查询
- primary
- 还有几个参数,这里就不说了
- type
连接类型。这个字段比较重要。
- const 最多有一个匹配行。用于比较primary key 或者unique索引。const是效率是非常好的。
- eq_ref
- ref
- ref_or_null
- index_merge
- unique_subquery
- index_subquery
- range
- index 该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)
- ALL 对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。
- possible_keys 提示使用哪个索引会在该表中找到行,不太重要
- keys MYSQL使用的索引,简单且重要
- key_len MYSQL使用的索引长度
- ref列显示使用哪个列或常数与key一起从表中选择行。
- 显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引
- Extra 该列包含MySQL解决查询的详细信息。
- Distinct MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
- Not exists
- range checked for each record
- using filesort
- using index 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的信息。
- using temporary 为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。出现using temporary就说明语句需要优化了,举个例子来说
- using where
- Using index for group-by
如果想要使查询尽可能快,应找出Using filesort 和Using temporary的Extra值。
利用 show profiles查看mysql语句执行时间
查看profile是否开启,数据库默认是不开启的。变量profiling是用户变量,每次都得重新启用。
show variables like “%pro%”;
开启方法:set profiling = 1;
可以开始执行一些想要分析的sql语句了,执行完后,show profiles;即可查看所有sql的总的执行时间。
show profile for query 1 即可查看第1个sql语句的执行的各个操作的耗时详情。
show profile cpu, block io, memory,swaps,context switches,source for query 6;可以查看出一条SQL语句执行的各种资源消耗情况,比如CPU,IO等
show profile all for query 6 查看第6条语句的所有的执行信息。
测试完毕后,关闭参数:
mysql> set profiling=0