根据前面所讲,我们应该比较熟悉B+树的属性:
- 每个索引对应一棵B+树,Innodb引擎默认会为我们建立以主键为规则的聚簇索引
- 聚簇索引的叶子节点保存用户的完整记录
- 二级索引是索引列+主键的组合,与聚簇索引不同的是,二级索引不会保存用户的完整记录
- B+树的每层页面都会按索引键升序排列,并会组成双向链表,用户的记录会组成单向列表
1、索引的代价
每建立一个索引就会生成一棵B+树,就会多占用一部分空间;并且更新记录时,需要维护所有的B+树。B+树结构只是让查询变得更快,对于修改操作反而可能带来性能的下降,因为更新数据的同时也要维护B+树。
所以说,并不是建立索引越多越有优势,我们需要在条件下使用。
2、使用索引的条件
- 匹配全部,条件类似=,in
- 配置左前缀。例如 like 'xx%'开头的可以用到索引,like '%xx'这辈子都用不到索引
- 匹配范围。因为索引键都是顺序排列的,索引范围查询时也能使用到索引。in()这种语句也算是范围查询,成为单点范围
- 排序、分组。索引列是升序排序的,所以排序规则与group by都能直接使用索引
- 使用组合索引时,条件里索引列的前后顺序十分严格。比如索引idx_column1_column2,条件只有column1的语句可以使用此索引,条件有column1+column2也可以使用此索引,但是条件里只有column2语句是不能使用此索引的
3、使用索引的建议
- 只为用于搜索、排序和分组的列建立索引
- 索引列的格式定义尽量小。能用tinyint不要使用int
- 索引列对应的值越分散越好
- 任何索引都会包含主键。主键占用的字节越小越好,推荐自增
- 不要建立重复的索引
- 二级索引为了避免回表,可以覆盖索引