mysql主键设计原则_InnoDB聚簇索引对性能的影响
主键不必是自增整数但强烈推荐非自增主键如UUID、字符串易引发页分裂、随机IO和索引碎片增大二级索引体积并降低缓存效率更新主键等于全行重建必须禁止无显式主键时InnoDB会生成隐藏ROW_ID存在冲突与排查风险。主键必须是自增整数不但强烈推荐InnoDB 表的主键直接决定聚簇索引的物理存储顺序。如果主键不是 AUTO_INCREMENT 整数比如用 VARCHAR(32) 存 UUID插入新行时很可能引发页分裂、随机 IO 和索引碎片——尤其在高并发写入场景下性能下降肉眼可见。自增整数主键让新记录总追加到索引末尾写入稳定、缓存友好UUID 或业务字段如身份证号、手机号做主键值无序 → 数据页频繁重排 → INSERT 变慢SELECT ... ORDER BY id 也未必快因为物理顺序 ≠ 逻辑顺序若必须用 UUID优先选 UUID_TO_BIN(UUID(), TRUE) 转为二进制并打乱时间位比原生字符串 UUID 更紧凑、局部性更好为什么不能用字符串或复合字段当主键InnoDB 的聚簇索引把主键值“复制”到所有二级索引的叶子节点里。主键越长二级索引占用空间越大缓存效率越低查询扫描成本越高。一个 VARCHAR(64) 主键 → 所有 INDEX 的每条索引记录都多存 64 字节甚至更多含长度前缀复合主键如 (tenant_id, order_id)会让每个二级索引条目都带上这两个字段极易突破 innodb_page_size 限制触发额外 IO主键被外键引用时子表索引也会继承全部主键列 —— 冗余放大效应非常明显主键更新等于全行重建务必禁止InnoDB 中修改主键值本质是删除旧行 插入新行聚簇索引要挪动数据所有二级索引都要同步更新指针。这不是“改个字段”而是最重的 DML 操作之一。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。