Mysql索引——索引失效
本文最后更新于16 天前,其中的信息可能已经过时,如有错误请留言

石灰华塔的崛起  |  莫诺湖的石灰华地层,加利福尼亚州,美国 (© Susanna Patras/TANDEM Stills + Motion)  –  2024/12/05

在时间的缓慢流逝下,凝灰岩——一种多孔石灰岩,成为大自然中最壮观的地貌之一。虽然这些塔在许多地方都能找到,但今天的图片展示的是加利福尼亚州莫诺县的莫诺湖。当富含钙质的淡水从几条小溪流入湖中,与湖中的碱性水混合后,就形成了这些结构。几个世纪以来,这种相互作用导致碳酸钙堆积,在湖面上形成了石灰华塔。为了保护这些塔,加利福尼亚州议会于1981年建立了莫诺湖图法国家自然保护区

莫诺湖是一个迷人的沙漠湖泊,湖水呈弱碱性,没有天然出口。这里的生态系统欣欣向荣,生活着数十亿只盐水虾和碱蝇。这些小生物是加利福尼亚海鸥和黑颈䴙䴘等各种候鸟必不可少的零嘴。太平洋航道是鸟类从阿拉斯加一直飞往巴塔哥尼亚的主要迁徙路线,而莫诺湖作为食物供应地,是航道上一个极为重要的中转站。

常见的几种引起索引失效的场景

1、对索引使用左模糊或者左右模糊匹配

当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。

因为索引 B+ 树是按照「索引值」有序排列存储的,只能根据前缀进行比较。

2、对索引列进行计算

包括以下几种情况:

  • 对索引使用函数
  • 对索引进行表达式计算
  • 对索引进行隐式类型转换

索引是按照列的值对数据进行了排序,如果对列进行计算之后,相当于是一个新的列,新的列没有进行过排序,所以相当于没有索引。

3、联合索引非最左匹配

类似于联合索引是(a, b, c)的情况,但是查询条件却是where b = 3 and c = 4的情况,需要是a = 2 and b = 3 and c = 4,这样才可以利用联合索引

4、where子句中的OR遇到非索引列

类似于or前面的列是索引列,or后面的不是索引列的情况,这时候,非索引列就要走全表扫描,这样的话那前面的列干脆也不用索引了,反正都得全表扫描。

如果or前后的列都是索引列,那么mysql就会依次通过两个索引列,把数据分别筛选出来,再进行合并,对应explain命令中的type是index_merge,如图所示

index merge 的意思就是对 id 和 age 分别进行了扫描,然后将这两个结果集进行了合并,这样做的好处就是避免了全表扫描。

感谢阅读!如有疑问请留言
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇