1. 为什么 MySQL 使用 B+ 树作为索引而不是 B 树?
MySQL 选择使用 B+ 树作为索引主要有以下几个原因:
- 减少 IO 次数,提高效率:B+ 树的所有数据都存储在叶子节点,非叶子节点只存储索引,树的高度较低,因此查找路径较短,减少了磁盘 IO 次数。
- 查询效率更加稳定:由于数据仅存储在叶子节点,所有查询都必须访问叶子节点,这使得查询时间更加稳定。
- 提高范围查询效率:B+ 树的叶子节点通过指针链接在一起,形成一个有序链表,这使得范围查询非常高效,只需一次遍历即可完成。
- 顺序读写:B+ 树叶子节点顺序存储数据,充分利用了磁盘的顺序读写性能,提高了整体读写效率。
2. 磁盘的顺序读和随机读有什么区别?
磁盘结构及 IO 操作
磁盘由盘片、磁头、主轴和控制电路集成板组成。一次 IO 操作包括以下步骤:
- 寻道时间:磁头移动到目标磁道所需的时间。
- 旋转延迟:目标磁道旋转到磁头下方所需的时间。
- 数据传输时间:从磁盘读取数据并传输到内存的时间。
顺序读与随机读
- 顺序读:磁头读取相邻扇区的数据,几乎不需要移动磁头,旋转延迟和寻道时间很短,读写速度快。
- 随机读:磁头在不同位置之间跳跃读取数据,频繁移动磁头和等待旋转,导致较高的寻道时间和旋转延迟,读写速度慢。
顺序 IO 与并发 IO
- 顺序 IO:单个磁盘一次只能处理一个 IO 指令,适合顺序读写。
- 并发 IO:多个磁盘组成的磁盘阵列(如 RAID)可以并行处理多个 IO 操作,提高了整体读写性能。
3. 什么是 Hash 索引?
Hash 索引是一种基于 Hash 表的数据结构,用于快速查找数据。其原理是通过哈希函数将键映射到哈希表的某个位置,然后直接访问该位置的数据。优点是查找速度非常快,缺点是无法进行范围查询和顺序访问。
4. 索引使用原则
列的离散度
列的离散度是指列的不同值的数量与总行数的比例。离散度越高,索引效果越好。公式如下:
count(distinct(column_name)) : count(*)
联合索引最左匹配
联合索引按列顺序从左到右建立搜索树。例如,联合索引 (name, phone),在查询时必须包含 name 才能使用索引。当 name 相等时