-
Using where:过滤元素;html
执行 explain SELECT * from test where b = '4' (b不是索引,全表扫描后,经过过滤获取所需数据)oop
执行 explain SELECT * from test where c = '4' (c是索引,经过索引定位到所需数据,不需过滤)优化
-
Using index:查询使用索引就能直接访问索引文件获取到所须要的数据;htm
执行 explain SELECT c from test where c = '4' (c是索引)blog
-
Using index condition:查询使用索引,但要访问数据文件(表数据)才能获取所须要的数据;排序
-
using firesort : order by时,在索引加得不当的状况下,都有可能出现Using filesort,这时候就要对SQL语句和索引进行优化了(我的理解:排序字段不是索引或排序字段是索引但没有用到就会出现using filesort)索引
-
using jion buffer(block nested loop):it
示例表io
CREATE TABLE `test` (
`a` varchar(20) NOT NULL,
`b` varchar(20) DEFAULT NULL,
`c` varchar(20) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;table
CREATE TABLE `prov` (
`id` varchar(32) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`height` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
执行
SELECT * FROM test t INNER JOIN prov v on t.c = v.id where v.id <'4';
说明:
从执行计划中看出v是基表,在查询中使用到了主键v.id,Extra是using where(由于过滤条件v.id<'4',即查询优化器先定位到 v.id='4'的记录,再查找符合要求的数据,从执行计划能够看出符合要求有3条数据,此为索引回表查询过程),t表中row=5,由于t.c不是索引,因此基表v的每条符合要求记录 与t表关联查询时t表都是全表扫描,因此Extra是using join buffer。
执行 ALTER table test add index inx_c(c) ,给t.c加索引,执行计划以下:
Extra是using index condition, 由于select * 是要读到表数据,可是使用了索引
执行 SELECT c from test where c = '5';
Extra是using index , 由于select c 查找时使用了索引,只从索引中就可获得数据,不用访问表数据
执行 SELECT * FROM test t INNER JOIN prov v on t.a = v.id where v.id <'4';
t表中row=1,由于t.a是主键,因此基表v的每条符合要求记录 与t表关联查询时是经过索引直接定位到符合要求的数据。
参考:http://blog.sina.com.cn/s/blog_5037eacb0102vkcp.html