创建聚簇索引(Clustered Index)前MySQL表的默认排序规则是什么
聚簇索引的必要性解答
首先你混淆了因果关系:你感知到的「MySQL InnoDB表默认按主键ID顺序存储」,本身就是聚簇索引带来的特性,二者不是“已经有序了为什么还要加索引”的互斥关系。
下面展开说核心原因:
- InnoDB的存储结构天然绑定聚簇索引,不存在没有聚簇索引的InnoDB表。整张表的行数据全部存在聚簇索引B+树的叶子节点上,相当于聚簇索引本身就是整张表。如果建表时你不主动指定主键,InnoDB会优先选非空唯一索引作为聚簇索引,连这类索引都没有的话,会自动生成一个隐藏的6字节
ROW_ID字段来构建聚簇索引,你按递增ID插入时的有序存储,本来就是聚簇索引维护出来的结果。 - 你假设的「新增记录依次按ID1、ID2插入所以数据本身有序」只是理想场景,实际业务中不可能一直保持物理存储绝对连续:
- 存在删除操作时,被删除的行留下的磁盘空位不会自动被连续的新插入数据填满,如果后续有行大小超过空位、或者插入非递增ID的操作,就会产生存储碎片,物理顺序会被打乱,聚簇索引的B+树结构会维护逻辑上的主键有序,保证查询时不受物理碎片影响。
- 即使真的能保持物理存储完全连续,你做主键条件查询时也不可能靠遍历整表找数据:比如你要查
SELECT * FROM table WHERE id = 99999,有聚簇索引的情况下可以通过B+树的树搜索快速定位到行,时间复杂度是O(log n),没有索引的话要遍历接近10万行才能拿到数据,性能差距极大。
- 聚簇索引的另一个核心优势是不需要回表:因为叶子节点直接存完整行数据,你按主键做等值、范围查询的时候,找到索引节点就直接拿到了所有需要的字段,比非聚簇索引查完还要回表取数据的效率高很多。
内容的提问来源于stack exchange,提问作者WhySoToxic
相关产品推荐
相关产品推荐

