MySQL 索引优化实战:从原理到最佳实践
📅 2024-06-10 📂 技术 👁️ 2340 次阅读为什么索引如此重要?
在数据量达到百万级别时,没有索引的全表扫描可能需要数秒甚至数十秒,而有索引的查询通常在毫秒级完成。
B+Tree 索引原理
MySQL InnoDB 引擎默认使用 B+Tree 数据结构来组织索引。B+Tree 是一棵平衡多路搜索树,所有数据都存储在叶子节点中,叶子节点通过双向链表连接,非常适合范围查询。
最左前缀原则
联合索引遵循"最左前缀"原则。假设有一个联合索引 (a, b, c):
- ✅ WHERE a = 1 — 可以使用索引
- ✅ WHERE a = 1 AND b = 2 — 可以使用索引
- ✅ WHERE a = 1 AND c = 3 — 只能用到 a 列
- ❌ WHERE b = 2 — 无法使用索引
- ❌ WHERE c = 3 — 无法使用索引
避免索引失效的常见场景
1. 在索引列上使用函数或运算:WHERE YEAR(create_time) = 2024
2. 隐式类型转换:WHERE phone = 13800000000(phone 是 varchar)
3. LIKE 以 % 开头:WHERE name LIKE '%test'
使用 EXPLAIN 分析
EXPLAIN SELECT * FROM articles
WHERE status = 'published'
ORDER BY published_at DESC;
关键指标:type 列应尽量达到 ref 或 const 级别,避免 ALL 全表扫描。