前言
本文讨论MySQL中索引的建立方式和优化原则
索引的建立
上一篇文章中讲述了MySQL的存储结构为B+树,因此,建立索引就是建立B+树的过程。对一张MySQL的表格而言,一般存在一个主键,则以主键为关键字建立B+树就是最基本的一种。除此以外,还可以针对非主键字段建立B+树来加快搜索。还可以针对多个字段建立索引,称为联合索引。
非主键索引的底层数据结构
在nnoDB中,对于一个非主键索引,同样建立b+树,
不同点是,叶子节点的元素不是整个数据,而是主键的值。因此通过非主键索引来查询会进行两次,先找到主键值,再去主键索引里找
优点:节省空间,保证一致性(如果每个索引都保存全部值,则按不同索引更新时就会出现不同)
联合索引
按照多个字段建立索引,此时顺序尤为重要。比如有三个字段来做索引,emp_no,title,from_date,则搜索时会先按第一个字段找,相同再按第二个,还相同按第三个。因此,联合索引只能按顺序使用,不能跳用。(如果不用第一个,就不能用第二个)
例子
分析:
总共建立了三个索引,是联合索引,分别为emp_no,title,from_date
- 会用到索引的三个字段
- 不会用索引(没用第一个字段,直接用了第二个字段)
- 会用索引
- 会用一个
- 会用
索引优化原则
最左前缀原则
由于联合索引会先按第一个字段比较,然后第二,然后第三。因此,如果查询语句的查询条件里没有第一个字段,只有二三,则不会运用联合索引。会遍历表逐行判断。
同理,只有1,3字段也不行。想用联合索引,查询语句的判断条件中必须包含从第一个字段开始的连续字段。
这就是最左前缀法则。即联合索引用了三个字段abc,则查询条件也要是a=,b=,c=或者a=,b=。即查询条件顺序必须和联合索引顺序相同
