MySQL
注意:括号中为八股在每次面试中出现的概率
索引失效的场景(674/1759=38.3%)
索引失效的场景是指在数据库查询中,虽然我们为某些字段建立了索引,但由于某些原因,查询时索引未能被使用,导致查询性能下降。接下来我会详细讲述常见的七个索引失效场景及其原因。
第一个是,当查询条件中使用了函数或表达式操作时,索引会失效。例如,在查询中对索引列使用了 UPPER()、LOWER() 或其他函数操作,数据库无法直接利用索引,因为索引存储的是原始值,而不是经过函数处理后的值。类似的,如果在索引列上进行数学运算(如 age + 1),也会导致索引失效。
第二个是,当查询条件中使用了类型隐式转换时,索引会失效。例如,如果索引列是字符串类型,而查询条件中传入的是数字类型,数据库会尝试将字符串列转换为数字进行比较,这种隐式转换会导致索引失效。正确的做法是确保查询条件的数据类型与索引列的数据类型一致。
第三个是,当查询条件中使用了 LIKE 并以通配符 % 开头时,索引会失效。例如,LIKE '%abc' 这种查询方式会让数据库无法利用索引,因为通配符 % 在开头意味着需要扫描整个表来匹配数据。而如果通配符出现在末尾,如 LIKE 'abc%',索引仍然可以生效。
第四个是,当查询条件中使用了 OR 且部分条件未命中索引时,索引可能失效。例如,如果查询条件是 WHERE indexed_column = 'value1' OR non_indexed_column = 'value2',即使 indexed_column 上有索引,但由于 non_indexed_column 没有索引,数据库可能会选择全表扫描,从而导致索引失效。
第五个是,当查询中使用了 NOT 或 != 操作符时,索引可能会失效。例如,WHERE column != 'value' 或 WHERE NOT column = 'value' 这样的查询条件通常会导致数据库放弃使用索引,因为这类操作需要扫描大量数据来排除不符合条件的记录。
第六个是,当查询中使用了复合索引但未遵循最左前缀原则时,索引会失效。例如,假设有一个复合索引 (A, B, C),如果查询条件只包含 B 或 C,而没有包含 A,那么这个复合索引将无法被使用。只有从最左边的列开始,并按顺序使用索引列,才能有效利用复合索引。
第七个是,当查询中使用了 IS NOT NULL 时,索引可能会失效。虽然 MySQL 支持对 IS NULL 使用索引,但在很多情况下,特别是 IS NOT NULL 的查询,数据库可能会选择全表扫描,从而导致索引失效。
如何记忆:
1.口诀记忆法
口诀:
函数运算别乱用,隐式转换要小心;LIKE 开头 % 失效,OR 混搭全表查;NOT 等于扫全表,复合索引左前定;IS NOT NULL 要注意,索引可能被抛弃。
解释:
第一句对应场景 1 和 2:函数操作(如 UPPER())和隐式类型转换都会导致索引失效。
第二句对应场景 3 和 4:LIKE '%abc' 和 OR 的部分条件未命中索引会导致性能下降。
第三句对应场景 5 和 6:NOT 或 != 操作符以及复合索引未遵循最左前缀原则。
第四句对应场景 7:IS NOT NULL 查询可能导致索引失效。
2.联想记忆法
联想:
场景 1(函数操作): 想象你在超市购物时,商品的价格标签上写着原价,但你用手机上的折扣计算器修改了价格。收银员无法直接使用标签上的价格,必须重新计算,效率变低。
场景 2(隐式转换): 想象你去国外旅行,拿着人民币买东西,店员需要先换算成外币才能交易,浪费时间。
场景 3(LIKE 开头 %): 想象你在图书馆找一本书,只知道书名的后半部分(如“...abc”)。你只能从第一本书开始一本本翻阅,而不是直接定位到目标。
场景 4(OR 条件): 想象你在两个房间中找钥匙,一个房间有灯(索引),另一个房间没灯(无索引)。为了确保找到钥匙,你只能挨个房间搜查。
场景 5(NOT/!=): 想象你在一群人中找一个“不是穿红衣服”的人,你需要检查每个人的衣服颜色,效率很低。
场景 6(复合索引未遵循最左前缀): 想象你有一本电话簿,按照“姓氏-名字-地址”排序。如果你只按“名字”查找,而忽略了“姓氏”,就无法快速定位。
场景 7(IS NOT NULL): 想象你在一堆文件中找“非空白页”,你需要一页页检查,无法直接跳过空白页。
拓展:
1.什么是最左匹配原则?
最左匹配原则是数据库中使用复合索引(联合索引)时的一个重要规则。它指的是:在查询条件中,必须按照复合索引中字段的顺序,从最左边的字段开始使用,才能充分利用索引。如果跳过了某个字段,则后续字段无法使用索引。
例如,假设有一个复合索引 (A, B, C):
查询条件包含 A 和 B 时,可以利用索引。
查询条件只包含 B 和 C 时,无法利用索引。
查询条件只包含 A 时,可以利用索引。
2.为什么需要满足最左匹配原则?
要理解这一点,我们需要从 B+树的存储结构入手。B+树是一种多路平衡查找树,其节点中的键值是按照一定顺序排列的。复合索引的多个字段会组合成一个有序的键值序列,并存储在 B+树的节点中。
(1)复合索引的存储方式
复合索引 (A, B, C) 的存储方式类似于一个多维排序:首先按字段 A 排序;如果 A 相同,则按字段 B 排序;如果 A 和 B 都相同,则按字段 C 排序。
例如,假设我们有以下数据:
A |
B |
C |
1 |
2 |
3 |
1 |
2 |
5 |
1 |
3 |
4 |
2 |
1 |
6 |
2 |
2 |
7 |
复合索引 (A, B, C) 在 B+树中的存储顺序为:
(1, 2, 3) -> (1, 2, 5) -> (1, 3, 4) -> (2, 1, 6) -> (2, 2, 7) -> (2, 2, 7)
(2)查询如何利用索引?
B+树的查找过程是从根节点开始,逐步向下查找,直到找到符合条件的叶子节点。为了高效地利用索引,查询条件必须与索引的排序顺序一致。
如果查询条件包含 A=1,可以直接定位到以 A=1 开头的所有记录。
如果查询条件包含 A=1 AND B=2,可以进一步缩小范围,定位到以 (A=1, B=2) 开头的所有记录。
如果查询条件只包含 B=2,由于 B+树的排序首先基于 A,因此无法直接定位到 B=2 的记录,只能进行全表扫描。
B+树、B树和红黑树的特点及区别?(647/1759=36.8%)
B+树、B树和红黑树是常见的平衡树数据结构,尤其在数据库、文件系统和内存中应用的十分广泛。接下来,我将从十一个方面详细讲解这三者的特点和区别。
第一个方面是数据存储位置。B+树将所有数据存储在叶子节点,非叶子节点只存储索引键;B树则将数据存储在叶子节点和非叶子节点中,所有节点都存储数据;而红黑树则在每个节点中都存储数据。
第二个方面是叶子节点结构。B+树通过链表连接叶子节点,这使得范围查询和顺序遍历非常高效;B树的叶子节点不一定通过链表连接,缺乏直接支持范围查询的结构;红黑树没有专门的叶子节点结构,所有节点通过指针连接。
第三个方面是索引查找效率。B+树的查找操作最终都在叶子节点完成,查找路径统一,效率较高;B树的查找操作可能在非叶子节点完成,查找路径不统一,效率稍低;红黑树的查找路径统一,时间复杂度为O(log n),每次操作通过旋转和重新染色来保持平衡。
第四个方面是树的高度。B+树由于扇出较高(每个节点存储多个键),树的高度通常较低,查询效率较高;B树由于非叶子节点也存储数据,扇出较小,树的高度较高;红黑树作为二叉查找树,树的高度较高,每个节点最多有两个子节点,树的深度较大。
第五个方面是顺序访问效率。B+树通过链表连接叶子节点,支持高效的顺序访问,尤其在范围查询时表现出色;B树没有直接的顺序访问机制,顺序访问效率较低;红黑树也缺乏顺序访问机制,顺序遍历效率较低。
第六个方面是磁盘I/O效率。B+树由于非叶子节点只存储索引,扇出高,可以减少磁盘访问次数,因此磁盘I/O效率非常优秀;B树稍逊于B+树,因为非叶子节点也存储数据,导致扇出较小,磁盘访问次数略多;红黑树的磁盘I/O效率较差,因为树的高度较高,每次查找可能需要频繁访问磁盘。
第七个方面是适用场景。B+树常用于数据库索引、文件系统索引,适合大规模数据的存储和检索,尤其在需要高效范围查询时;B树适用于数据库索引和文件系统索引,但相比B+树,查找效率稍低;红黑树适用于内存中的数据结构,如Java中的TreeMap和TreeSet,适合存储符号表、集合、关联数组等内存数据。
第八个方面是平衡性。B+树将所有叶子节点置于同一层,平衡性非常好;B树平衡性较好,但查找路径不统一,效率稍逊;红黑树通过旋转和染色来保持平衡,查找路径统一,操作保持平衡。
第九个方面是插入/删除操作。B+树的插入和删除操作可能会引发节点分裂和合并,操作较复杂;B树的插入和删除操作也可能引发节点分裂和合并,操作较复杂;红黑树通过旋转和染色保持平衡,操作相对简单。
第十个方面是实现复杂度。B+树的实现较复杂,尤其是在处理链表结构和节点分裂/合并时;B树的实现也较复杂,涉及节点分裂/合并,但相对较为简单;红黑树的实现相对简单,通过旋转和染色来保持平衡。
第十一个方面是空间利用率。B+树的空间利用率较高,非叶子节点只存储索引,存储效率较好;B树的空间利用率较低,非叶子节点存储数据和索引,存储效率较低;红黑树的空间利用率较高,所有节点都存储数据,且由于树的平衡性,内存利用效率较好。
如何记忆:
1.口诀记忆法
口诀:
数据存储分三层,叶子链表B+赢;查找路径统一分,磁盘I/O效率高;树高矮胖各不同,范围查询靠链表;插删复杂旋转忙,平衡实现各有招。
解释:
第一句对应 数据存储位置 和 叶子节点结构 :B+树数据全在叶子,B树数据分散,红黑树每个节点存数据。
第二句对应 索引查找效率 和 磁盘I/O效率 :B+树统一在叶子查找,磁盘I/O最优。
第
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
神哥引路,稳稳起步!!早鸟特惠,仅剩177名额!晚了就涨到29.9了! 核心亮点: 1.数据驱动,精准高频:基于1759篇面经、24139道八股题,精准提炼真实高频八股。 2.科学记忆,高效掌握:融合科学记忆法和面试表达技巧,记得住,说得出。 3.提升思维,掌握财商:不仅可学习八股,更可教你变现,3个月赚不回购买价,全额退。 适宜人群: 在校生、社招求职者及自学者。