MySQL的聚簇索引是数据与索引合一的B+Tree结构,InnoDB表有且仅有一个,优先选主键,其次非空唯一索引,否则隐式生成row_id;其决定物理存储顺序,故唯一,且影响查询高效性与写入开销。
MySQL 中的聚簇索引(Clustered Index)不是一种独立的索引类型,而是一种数据存储方式:它把索引结构和实际数据行存放在同一个 B+Tree 中,叶子节点直接包含完整的用户记录。InnoDB 表必须且只能有一个聚簇索引,因为数据行在磁盘上的物理顺序只能按一种方式排列。
InnoDB 会自动为每张表创建一个聚簇索引,选择逻辑如下:
因为聚簇索引决定了数据行在磁盘上的物理存储顺序。一行数据不可能同时按主键顺序、又按时间戳顺序、再按用户名顺序存放。B+Tree 的叶子节点既是索引项,又是真实数据页,所以一个表只能有一种“数据摆放方式”——这也就锁定了聚簇索引的唯一性。
它的特性直接影响性能表现:
WHERE id BETWEEN 100 AND 200,数据物理连续,I/O 更少;
新有代价:若主键非自增(如 UUID),新记录可能插入中间页,引发页分裂与碎片;关键区别在于叶子节点内容: