1.条件字段选择性弱时不走索引
原因: mysql在条件字段选择性弱,查出的结果集较大,不走索引;
比如,一张表内有1W条数据,某个字段为0的数据有9999条,为1的只有1条。这是sql筛选条件查询这个字段为0的数据,此时sql不会走索引。原因是9999条数据相比于1W条数据近乎于全表扫描,如果走索引效率反而不如全表扫描高。
解决办法 尽量避免条件字段选择性弱的查询,如果多个条件中的某个条件是这种情况且不得不用时,也不影响,比如查询某些条件下未删除的数据,且这张表内被删除数据非常少时。不用强求走索引。
往来单位查询时:根据来源字段建索引,1W条数据时,客户档案来源9K,其他来源1K,用客户档案的值当来源值查询时,不走索引
2.隐式转换
字段值是字符型,入参值非字符型,会进行隐式转换,查询慢,使用concat函数转成字符型
3.like查询索引失效
全模糊和左模糊不走索引,右模糊走索引。当左模糊时使用方向索引
a.like %code 索引失效,使用全表扫描。但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全表扫描。如where reverse(code) like reverse('%code')
b.like code% 索引有效。
c.like %code% 索引失效,也无法使用反向索引。
全模糊使用like,索引失效,如果可能可以使用覆盖索引。无法使用覆盖索引时,可以使用函数locate,position等,字段是否包含某字符。大数据量情况下,查询性能locate>position>like
网友评论