vimarsana.com
Home
Live Updates
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day28】—— 数据库5_陈哈哈的菜园子-CSDN博客 : vimarsana.com
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day28】—— 数据库5_陈哈哈的菜园子-CSDN博客
如果有一个 2 列的索引 (a, b),则已经对 (a)、(a, b) 上建立了索引;
如果有一个 3 列索引 (a, b, c),则已经对 (a)、(a, b)、(a, b, c) 上建立了索引;
假设数据 表 LOL (id,sex,price,name) 的物理位置(表中的无序数据)如下:
(注:下面数据是测试少量数据选用的,只为了方便大家看清楚。实际操作中,应按照使用频率、数据区分度来综合设定索引顺序~)
主键id sex(a) price(b) name(c)
(1) 1 1350 AAA安妮
(2) 2 6300 MMM盲僧
(3) 1 3150 NNN奈德丽
(4) 2 6300 CCC锤石
(5) 1 6300 LLL龙女
(6) 2 3150 EEE伊泽瑞尔
(7) 2 6300 III艾克
(8) 1 6300 BBB暴走萝莉
(9) 1 4800 FFF发条魔灵
(10) 2 3150 KKK卡牌大师
(11) 1 450 HHH寒冰射手
(12) 2 450 GGG盖伦
(13) 2 3150 OOO小提莫
(14) 2 3150 DDD刀锋之影
(15) 2 6300 JJJ疾风剑豪
(16) 2 450 JJJ剑圣
当你在LOL表创建一个联合索引 abc_index:(sex,price,name)时,生成的
索引文件逻辑上等同于下表内容(分级排序):
sex(a) price(b) name(c) 主键id
1 450 HHH寒冰射手 (11)
1 1350 AAA安妮 (1)
1 3150 NNN奈德丽 (3)
1 4800 FFF发条魔灵 (9)
1 6300 BBB暴走萝莉 (8)
1 6300 LLL龙女 (5)
2 450 GGG盖伦 (12)
2 450 JJJ剑圣 (16)
2 3150 DDD刀锋之影 (14)
2 3150 EEE伊泽瑞尔 (6)
2 3150 KKK卡牌大师 (10)
2 3150 OOO小提莫 (13)
2 6300 CCC锤石 (4)
2 6300 III艾克 (7)
2 6300 JJJ疾风剑豪 (15)
2 6300 MMM盲僧 (2)
小伙伴儿们有没有发现B+树联合索引的规律?感觉还有点模糊的话,那咱们再来看一张索引存储数据的结构图,或许更明了一些。
这是一张来自思否上的图片,层次感很清晰,小伙伴可以看到,对于B+树中的联合索引,
每级索引都是排好序的。联合索引
由上图可以看出,B+ 树的数据项是复合的数据结构,同样,对于我们这张表的联合索引 (sex,price,name)来说 ,B+ 树也是按照从左到右的顺序来建立搜索树的,当SQL如下时:
select sex,price,name from LOL where sex = 2 and price = 6300 and name = 'JJJ疾风剑豪';
B+ 树会优先比较 sex 来确定下一步的指针所搜方向,如果 sex 相同再依次比较 price 和 name,最后得到检索的数据;
二、违背最左原则导致索引失效的情况
1、查询条件中,缺失优先级最高的索引 “a”
当
where b = 6300 and c = 'JJJ疾风剑豪' 这种没有以 a 为条件来检索时;B+树就不知道第一步该查哪个节点,从而需要去全表扫描了(即不走索引)。因为建立搜索树的时候 a 就是第一个比较因子,必须要先根据 a 来搜索,进而才能往后继续查询b 和 c,这点我们通过上面的存储结构图可以看明白。
Related Keywords
China
,
Zhejiang
,
Shenzhen
,
Guangdong
,
Chinese
,
Chan
,
,
Hundred Days Sprint
,
Zhejiang Shanghai
,
Step The
,
சீனா
,
ஜெஜியாங்
,
ஷென்சென்
,
குவாங்டாங்
,
சீன
,
சான்
,
vimarsana.com © 2020. All Rights Reserved.