三、MySQL调优之索引:索引的失效与优化
一.MySQL 索引存储结构
索引是优化数据库查询最重要的方式之一,它是在 MySQL 的存储引擎层中实现的,所以每一种存储引擎对应的索引不一定相同。
索引类型 | MyISAM引擎 | InnoDB引擎 | Memory引擎 |
---|---|---|---|
B+Tree索引 | yes | yes | yes |
HASH索引 | no | no | yes |
R-Tree索引 | yes | no | no |
Full-Text索引 | yes | no | no |
B+Tree 索引和 Hash 索引是我们比较常用的两个索引数据存储结构,B+Tree 索引是通过 B+ 树实现的,是有序排列存储,所以在排序和范围查找方面都比较有优势。
Hash 索引相对简单些,只有 Memory 存储引擎支持 Hash 索引。Hash 索引适合 key-value 键值对查询,无论表数据多大,查询数据的复杂度都是 O(1),且直接通过 Hash 索引查询的性能比其它索引都要优越。
在创建表时,无论使用 InnoDB 还是 MyISAM 存储引擎,默认都会创建一个主键索引,而创建的主键索引默认使用的是 B+Tree 索引。不过虽然这两个存储引擎都支持 B+Tree 索引,但它们在具体的数据存储结构方面却有所不同。
二.索引调优方法
1、覆盖索引优化查询
2、自增字段作主键优化查询
在使用 InnoDB 存储引擎时,如果没有特别的业务需求,建议使用自增字段作为主键。
3、前(后)缀索引优化
索引的本质就是使用空间换时间,对于数据库来讲,表中数据所占用的空间很小,索引占用的空间很大,可以使用前缀索引或者后缀索引去减小索引的大小。
不过,前(后)缀索引是有一定的局限性的,例如 order by 就无法使用前缀索引,无法把前(后)缀索引用作覆盖索引。
4、防止索引失效(仅讨论innodb)
不同的索引引擎使用的是不同的索引数据结构
数据库索引失效的可能