一文了解MySQL索引机制

💡 原文中文,约7300字,阅读约需18分钟。
📝

内容提要

这篇文章介绍了MySQL数据库中的索引模型、索引维护、索引利用和索引实践,提供了优化索引的建议和解释了索引失效的原因。

🔎

延伸解读

为什么InnoDB选择B+树而非哈希或有序数组

哈希表插入快但查询需全扫描,有序数组查询快但更新成本高。B+树在查询和更新上都保持O(log(N))复杂度,且通过N叉树降低树高,减少磁盘IO。例如,整数索引的N约1200,树高4可存17亿数据,查找仅需3次磁盘访问。这解释了B+树在数据库索引中的优势。

主键自增如何避免页分裂

B+树维护索引有序性有代价:插入中间值需挪动数据,页满时触发页分裂,影响性能。主键自增使每次插入都是追加,不会挪动数据或触发页分裂。同时,主键长度越小,索引叶子节点占用空间越小,因此建议使用整型自增主键,避免随机数主键。

唯一索引与普通索引的性能差异

查询时两者性能差异可忽略,但更新时若数据页不在内存,唯一索引需读磁盘判断冲突,而普通索引可使用change buffer缓存更新,减少随机IO。因此写多读少的业务推荐普通索引;写后立即读的业务,change buffer会立即merge,反而增加开销,可考虑唯一索引。

索引失效的常见原因与规避

索引失效常见于:使用SELECT *、联合索引未遵循最左匹配、在索引列上做函数或类型转换、以%开头的LIKE、OR条件中部分列无索引。例如,where month(modified)=6会导致全表扫描,因为索引树存储的是原始日期值。规避方法是保持查询条件与索引列直接比较,避免函数操作。

❓

Q&A

MySQL索引的主要作用是什么?

MySQL索引的主要作用是提高数据查询效率,类似于书的目录。

B+树在MySQL中是如何工作的?

B+树在MySQL中作为索引数据结构,叶子节点存储整行数据,支持O(log(N))的查询和更新复杂度。

什么是覆盖索引,它有什么优势?

覆盖索引是指查询的字段已经在索引中,无需回表,能显著提高查询效率。

索引失效的常见原因有哪些?

索引失效的常见原因包括使用SELECT *、联合索引未遵循最左匹配原则、函数操作等。

如何优化MySQL中的索引选择?

优化索引选择应考虑查询频率、排序需求和连接字段,避免在不常查询的字段上建立索引。

explain语句在MySQL中有什么作用?

explain语句用于获取SQL执行计划,帮助分析查询效率。

🏷️

标签

➡️

继续阅读