PRIMARY KEY。UNIQUE INDEX。INDEX 或 KEY。FULLTEXT,针对 CHAR/VARCHAR/TEXT。| 特性 | 聚集索引 | 非聚集索引 |
|---|---|---|
| 存储方式 | 数据行与主键同文件 | 索引与数据分离 |
| InnoDB | 主键即聚集索引 | 二级索引叶子存主键值 |
| MyISAM | 不支持 | 叶子存物理地址指针 |
| 维度 | MyISAM | InnoDB |
|---|---|---|
| 全文索引 | 支持 | 5.6+ 支持 |
| 事务 | 不支持 | 支持 |
| 索引/数据存储 | 分离 | 共存 |
| 缓存机制 | key_buffer_size 仅缓索引,数据依赖 OS | buffer_pool 缓索引+数据 |
| 基数统计 | 精确,持久化 | 估算,内存中 |
| 前缀压缩 | 支持字符串前缀压缩 | 不支持 |
组合索引 (a,b,c) 仅当 WHERE 条件从最左列连续出现时生效:
a、a,b、a,b,cb、b,c、a,c(断层)>、<、LIKE '%...')后的列失效SELECT id FROM t WHERE id > 100 仅扫描索引,无回表。WHERE 条件,减少回表次数。索引列不可参与表达式或函数运算:
-- ❌ 失效
WHERE last_login + 1 = 8388606
WHERE DATE(created_at) = '2023-01-01'
-- ✅ 生效
WHERE last_login = 8388605
WHERE created_at >= '2023-01-01' AND created_at < '2023-01-02'
WHERE 满足最左前缀,且 ORDER BY 列为索引子集 → 使用索引排序,Extra 无 Using filesort。ASC/DESC 仍可用索引(MySQL 8.0+ 支持降序索引)。索引选择性 = COUNT(DISTINCT col) / COUNT(*)
-- 唯一索引选择性 = 1(最优)
-- 选择性 < 0.2 优化器常放弃索引,改全表扫描
长字符串列可用前缀索引:INDEX(name(10)),通过测试不同长度逼近 1。
INDEX(a) 与 INDEX(a,b) 共存 → 前者冗余。| 参数 | 引擎 | 建议 |
|---|---|---|
key_buffer_size | MyISAM | 物理内存 25%-30%,过大反不稳 |
innodb_buffer_pool_size | InnoDB | 物理内存 60%-80%,核心参数 |
sort_buffer_size | 通用 | 按会话分配,避免全局过大 |
read_rnd_buffer_size | 通用 | 大查询会话级调大,优化 ORDER BY |
join_buffer_size | 通用 | 无索引 JOIN 时生效 |
OPTIMIZE TABLE:MyISAM 整理碎片;InnoDB 等同 ALTER TABLE ... ENGINE=InnoDB 重建表。ANALYZE TABLE:更新统计信息,数据量大幅变化后执行。CHECK TABLE:校验表损坏,MyISAM 同步更新统计信息。REPAIR TABLE:仅 MyISAM 支持,修复损坏表。ALTER(5.6+ Online DDL 支持大部分操作)。RENAME TABLE 原子切换(pt-online-schema-change 自动化)。(注:原文图片链接已保留,建议替换为本地或 CDN 加速地址)