关于Mysql的江湖传言
SunRan

谣言粉碎机

谁说必须遵循最左匹配原则?

创建组合索引在查询语句时必须遵循最左匹配原则,即 where 时组合索引的第一个索引列必须在最前面。不然会索引失效!
这是常见的八股文了,原理上没毛病,在B+树上每个非叶子节点不可能逐个比较条件语句,通过组合索引的第一个匹配。但是优化器在执行前会帮助我们调整where 的顺序,开发者不强制顺序,但是最好还是遵循一下。

SELECT * FROM client WHERE age = 18 AND shop_id = 1
SELECT * FROM client WHERE shop_id = 1 AND age = 18

如上两条SQL,结果一样只是where的顺序不同,组合索引字段设置为 "shop_id ","age ",如果按照江湖传言最左匹配的话第一条时无法命中索引的,但是通过 EXPLAIN查看,两条语句的结果相同。

谁说组合索引遇到范围查询就失效?

在一个组合索引中如:where shop_id = 2 and client_type = 2 and age >18 ,即使 "shop_id ","age ","client_type "有一个组合索引但是因为 age的范围查询会不走索引。

首先这是错误的,在MySQL5.6版本后推出了索引下推机制,非等值查询也并不会导致索引失效了。

谁说使用SQL函数会索引失效?

查询中不能使用内置的函数否则会索引失效,也是常见的八股文之一了那么事实情况是什么样?

1
EXPLAIN SELECT * FROM client WHERE shop_id = 1 AND nick_name = CONCAT("雷","达") 


在如上语句中使用了 CONCAT但是查询计划还是命中索引

还例如:

1
EXPLAIN SELECT * FROM client WHERE shop_id = 1 AND create_time = NOW()


同样使用了索引

再或者

1
EXPLAIN SELECT max(age) FROM client WHERE shop_id = 1 AND gmt_create = NOW()

  • 5.7新增特性:可以使用函数索引

谁说计算会导致索引失效?

还是前面的例子

1
EXPLAIN SELECT max(age) FROM client WHERE shop_id = 10-9 AND gmt_create = NOW()

shop_id没有直接写1 ,使用了 10-9,最终的效果时一样的。

  • 本文标题:关于Mysql的江湖传言
  • 本文作者:SunRan
  • 创建时间:2022-01-08 18:34:52
  • 本文链接:https://lksun.cn/2022/01/08/关于Mysql的江湖传言/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论