一文了解MySQL索引机制
内容提要
这篇文章介绍了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执行计划,帮助分析查询效率。