java面试题网

普通会员

108

帖子

11

回复

136

积分

楼主
发表于 2018-04-18 09:48:54 | 查看: 882| 回复: 1

总结一下,当order by 中的字段出现在where条件中时,才会利用索引而不排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作,这个结论不仅对order by有效,对其他需要排序的操作也有效,如group by 、union 、distinct等。这种情景下若要走索引需单独建立一个order by 条件的索引,并删除带order by条件的联合索引,不仅postgresql如此,mysql也会这样。我当时在优化无聊看看网的时候也曾入过坑!



普通会员

108

帖子

11

回复

136

积分
沙发
发表于 2018-04-18 10:01:56

MySQL无法使用索引的情况

(1).以%开头的like查询

(2).数据类型出现隐式转换的时候也不会使用索引,特别是当列类型是字符串,那么一定记得在where条件中把字符串常量值用引号引起来,否则即便这个列上有索引,MySQL也不会用到,因为MySQL默认把输入的常量值进行转换以后才进行检索

(3).复合索引的情况下,如果查询条件不包含索引列的最左边部分,即不满足最左前缀原则,则不会使用索引

(4).如果mysql估计使用索引扫描比全表扫描更慢,则不使用索引。(扫描数据超过30%,都会走全表)

(5).用or分割开的条件,如果 or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到

(6).字段使用函数,将无法使用索引

(7).Join 语句中 Join 条件字段类型不一致的时候 MySQL 无法使用索引


您需要登录后才可以回帖 登录 | 立即注册

java面试题网无聊看看网与java建站系统提供技术支持V2.1 网站地图 © 2016-2018