MySQL 索引为什么能加速查询?
MySQL 索引为什么能加速查询?
没有索引时
SELECT * FROM posts WHERE slug = 'event-loop';
MySQL 只能从头扫描全表(全表扫描),100 万行就要比对 100 万次。
B+ 树索引
InnoDB 的索引底层是 B+ 树,它是一棵矮胖的多路平衡树:
- 非叶子节点只存键值和指针
- 数据(或主键)都存在叶子节点
- 叶子节点之间用链表相连,非常适合范围查询
3~4 层的 B+ 树就能支撑千万级数据,意味着任意一次查询只要 3~4 次磁盘 I/O。
创建索引
CREATE INDEX idx_posts_slug ON posts (slug);
查看执行计划确认是否命中:
EXPLAIN SELECT * FROM posts WHERE slug = 'event-loop';
type 列出现 ref、key 列显示索引名,就说明走了索引。
注意事项
- 索引不是越多越好:写入时需要维护索引,会降低 INSERT/UPDATE 性能
- 遵循最左前缀原则设计联合索引
- 对区分度低的字段(如状态只有 0/1)建索引意义不大
- 用
LIKE '%xxx'前导通配符会让索引失效
看到这里了?如果这篇文章帮到过你
请我喝瓶可乐就好 🥤

评论0 条
还没有评论,来抢沙发~