关于Mysql的江湖传言
谣言粉碎机
谁说必须遵循最左匹配原则?
创建组合索引在查询语句时必须遵循最左匹配原则,即 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 许可协议。转载请注明出处!
评论