执行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)


详细的描述见我的笔记第12章。


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


分析可得:是否使用索引,从多少条记录中找出,排序的方式。