I:using where:表示存储引擎返回的记录并不是所有的都满足查询条件,需要在server层进行过滤。查询条件中分为限制条件和检查条件,5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后server层根据检查条件进行过滤再返回真正符合查询的数据。5.6.x之后支持ICP特性,可以把检查条件也下推到存储引擎层,不符合检查条件和限制条件的数据,直接不读取,这样就大大减少了存储引擎扫描的记录数量。extra列显示using index condition
(1) - like ‘%xx‘ # like模糊匹配 select * from tb1 where name like ‘%cn‘; # 不走索引 select * from tb1 where name like ‘cn%‘; # 走索引
结论: %前面有实际值的走索引,%在前面的不走索引
(2) - 使用mysql内置函数 select * from tb1 where reverse(name) = ‘wupeiqi‘; # reverse 相反
结论: 不可在查询条件处使用mysql内置函数
(3) - 查询数据表中某列时间 nid name ctime 2016-9-10 11:59 当前时间: 2016/9/10
select * from tb1 where conv(ctime,‘.,..‘) = time; # 不可转数据表中时间列的类型 # 转成 select * from tb1 where ctime = 转(2016/9/10)=> 2016-9-10 # 应转当前时间的类型
结论: 把数据表中时间列转换了索引就不存在了
(4) - or select * from tb1 where nid = 1 or email = ‘[email protected]‘; # 当两列是为索引时,才会走索引 特别的:当or条件中有未建立索引的列才失效,以下会走索引 select * from tb1 where nid = 1 or name = ‘seven‘; # index 合并索引 select * from tb1 where nid = 1 or email = ‘[email protected]‘ and name = ‘alex‘
结论: 当两列是为索引时,才会走索引,一般都是index 合并索引
(5) - 类型不一致 select * from tb1 where name = 999;
结论: 如果列是字符串类型,传入条件是必须用引号引起来,不然...
(6) - != (不等于) select * from tb1 where name != ‘alex‘ 特别的:如果是主键,则还是会走索引
结论: 在使用!=的情况下,只有主键会走索引
(7) - > (大于) select * from tb1 where name > ‘alex‘ 特别的:如果是主键或索引是整数类型,则还是会走索引 select * from tb1 where nid > 123 # 索引为整数
结论: 如果是主键或索引是整数类型,则还是会走索引
(8) - order by select email from tb1 order by name desc; 当根据索引排序时候,选择的映射如果不是索引,则不走索引 特别的:如果对主键排序,则还是走索引: