为什么索引有最左前缀原则?

三千大千世界 2014-03-10 11:20:27
多列字段做索引,state/city/zipCode,想要索引生效的话,只能使用如下的组合
state/city/zipCode
state/city
state
其他方式(如city,city/zipCode),则索引不会生效
这种现象是怎么导致的?和索引的存储方式有关吗?
高手讲解一下,感谢。
...全文
2645 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bnrmaster 2016-10-26
  • 打赏
  • 举报
回复
通常说的索引是B-Tree索引,树状的,搜索需要从根节点出发,上层节点对应靠左的值,搜索需要从根节点出发,所以有最左原则
liu602348184 2015-09-14
  • 打赏
  • 举报
回复
引用 7 楼 yangzaizhong 的回复:
假设数据 表T (a,b,c) rowid 为物理位置 rowid a b c (1) 1 1 1 (2) 2 1 13 (3) 2 2 14 (4) 1 3 3 (5) 2 3 12 (6) 1 2 5 (7) 2 3 9 (8) 1 2 2 (9) 1 3 6 (10) 2 2 11 (11) 2 2 8 (12) 1 1 7 (13) 2 3 15 (14) 1 1 4 (15) 2 1 10 当你创建一个索引 create index xxx on t(a,b), 则索引文件逻辑上等同于如下 a b rowid 1 1 1 1 1 12 1 1 14 1 2 6 1 2 8 1 3 4 1 3 9 2 1 2 2 1 15 2 2 3 2 2 10 2 2 11 2 3 5 2 3 7 2 3 13 当select * from T where a=1 and b=3 的时候, 数据库系统可以直接从索引文件中直接二分法找到A=1的记录,然后再B=3的记录。 但如果你 where b=3 则需要遍历这个索引表的全部!
非常有用 学习了
珠海-天堂 2014-12-03
  • 打赏
  • 举报
回复
索引的最大好处就是:它必然是有序的 如果这个优点都不能利用,那索引也就没什么价值了。 排序规则楼上已经说了
仲涵 2014-12-01
  • 打赏
  • 举报
回复 24
假设数据 表T (a,b,c) rowid 为物理位置 rowid a b c (1) 1 1 1 (2) 2 1 13 (3) 2 2 14 (4) 1 3 3 (5) 2 3 12 (6) 1 2 5 (7) 2 3 9 (8) 1 2 2 (9) 1 3 6 (10) 2 2 11 (11) 2 2 8 (12) 1 1 7 (13) 2 3 15 (14) 1 1 4 (15) 2 1 10 当你创建一个索引 create index xxx on t(a,b), 则索引文件逻辑上等同于如下 a b rowid 1 1 1 1 1 12 1 1 14 1 2 6 1 2 8 1 3 4 1 3 9 2 1 2 2 1 15 2 2 3 2 2 10 2 2 11 2 3 5 2 3 7 2 3 13 当select * from T where a=1 and b=3 的时候, 数据库系统可以直接从索引文件中直接二分法找到A=1的记录,然后再B=3的记录。 但如果你 where b=3 则需要遍历这个索引表的全部!
wutuobang321 2014-03-11
  • 打赏
  • 举报
回复
多列索引是先按照第一列进行排序,然后在第一列排好序的基础上再对第二列排序,如果没有第一列的话,直接访问第二列,那第二列肯定是无序的,直接访问后面的列就用不到索引了。
三千大千世界 2014-03-10
  • 打赏
  • 举报
回复
楼上的那种理解方式,我也知道,我想知道更具体或者底层的原因,从索引存储结构和数据库引擎的查找方式来说
benluobo 2014-03-10
  • 打赏
  • 举报
回复
你可以认为联合索引是闯关游戏的设计 例如你这个联合索引是state/city/zipCode 那么state就是第一关 city是第二关, zipCode就是第三关 你必须匹配了第一关,才能匹配第二关,匹配了第一关和第二关,才能匹配第三关 你不能直接到第二关的 索引的格式就是第一层是state,第二层才是city
ACMAIN_CHM 2014-03-10
  • 打赏
  • 举报
回复
和索引的存储方式有关
三千大千世界 2014-03-10
  • 打赏
  • 举报
回复
引用 3 楼 rucypli 的回复:
索引是因为B+树结构 所以查找快 如果单看第三列 是非排序的
索引是有序的,而且是按照state/city/zipCode 这个顺序的,但是用前2列的话,就还是有序的? 那数据库引擎是怎么查找索引的,这3个列顺序比较的还是怎么找的?
rucypli 2014-03-10
  • 打赏
  • 举报
回复
索引是因为B+树结构 所以查找快 如果单看第三列 是非排序的

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧