执行sql语句之前用explain来分析。
explain不能分析出来使用了多少时间。
`使用反斜杠+大G来对结果分行显示,使用\G的时候 不需要使用分号了。
mysql> explain select * from emp where empno=468135 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: emp
type: ref
possible_keys: empno
key: empno
key_len: 3
ref: const
rows: 1
Extra: NULL
1 row in set (0.00 sec)
id:用到的索引数(不重要)
select_type:(链接方式,不是很重要)
table:现在对那张表查询
type:访问方式(很重要)
主要分析三个值:
1.ALL:完整的表扫描(最慢),加了索引就不会全表扫描了
2.system
3.const(最快的)
possible key:可能用到的索引
key:实际用到的索引
key_len:索引的长度 不重要
ref:不是很重要,表示引用
row:从多少行里面取出的数据
删除索引后对表的查询影响如下:
mysql> explain select * from emp where empno=8655214 or empno=4863534 limit 0,1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: emp
type: range
possible_keys: empno
key: empno
key_len: 3
ref: NULL
rows: 2
Extra: Using index condition
1 row in set (0.00 sec)
mysql> alter table emp drop index empno;
Query OK, 14000000 rows affected (19.28 sec)
Records: 14000000 Duplicates: 0 Warnings: 0
mysql> explain select * from emp where empno=8655214 or empno=4863534 limit 0,1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: emp
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 14000000
Extra: Using where
1 row in set (0.03 sec)
extra:查询细节信息(比较重要)
no tables use,比如说用了dual
using filesort:无法使用索引排序不得已使用了文件排序 - -值得注意的是就算是order by 主键也会是using filesort的,所以order by 要尽量避免
using temporary:某些操作要使用临时表,某些groupby和order by(不知道是那一种)
using where:(比较好)不用读取所有表中的信息,仅仅通过索引就可以获得所有信息 ,感觉有点像using index
分析可得:是否使用索引,从多少条记录中找出,排序的方式。