- 数据库索引是什么? B树
- B树是如何工作的?按排序顺序存储数据
- 如果无序排序/随机uuid会怎么样? 页分裂,碎片化,写入性能下降,空间浪费
- 具体好处:快速查找(二分查找),范围查询(between 、>),排序,顺序插入(页填充)
- 聚簇索引中,数据行按主键顺序在磁盘上物理存储
最根本的原因是索引的数据结构是B+树,还有聚簇索引的物理存储。
需要从四个方面看:
- 核心机制(B+树)
- 插入性能(页分裂)
- 查询性能(范围/排序)
- 存储空间(碎片)
因为B+树需要有序才能工作,有序是二分查找和范围查找的前提
其次,主键是聚簇索引,聚簇索引中表数据按照主键物理存储。如果有序,数据追加到末尾,只需填满页。如果无序,插入位置随机,导致页分裂,大量磁盘I/O和碎片化。
详细说明
写入性能
无序插入,新插入的行可能落在已满的旧数据页中间,导致innodb必须页分裂(申请新页,移动数据)来腾出空间,这不仅消耗大量IO,还会产生磁盘碎片。
而有序主键,只会写满旧页,再开新页,写入速度极快。
辅助索引的回表效率
辅助索引叶子节点,存储主键
主键有序,那么辅助索引查找到的数据,在物理上紧密相邻,回表时利用磁盘预读特性,一次性加载相邻行,大幅减少随机io。
高效的范围查询
因为有序,所以范围查找,能根据链表顺序扫描。
无序,就会退化为几乎全表扫描