MySQL笔记之二索引建立和优化

前言

本文讨论MySQL中索引的建立方式和优化原则

索引的建立

上一篇文章中讲述了MySQL的存储结构为B+树,因此,建立索引就是建立B+树的过程。对一张MySQL的表格而言,一般存在一个主键,则以主键为关键字建立B+树就是最基本的一种。除此以外,还可以针对非主键字段建立B+树来加快搜索。还可以针对多个字段建立索引,称为联合索引。

非主键索引的底层数据结构

在nnoDB中,对于一个非主键索引,同样建立b+树,

不同点是,叶子节点的元素不是整个数据,而是主键的值。因此通过非主键索引来查询会进行两次,先找到主键值,再去主键索引里找

优点:节省空间,保证一致性(如果每个索引都保存全部值,则按不同索引更新时就会出现不同)

联合索引

按照多个字段建立索引,此时顺序尤为重要。比如有三个字段来做索引,emp_no,title,from_date,则搜索时会先按第一个字段找,相同再按第二个,还相同按第三个。因此,联合索引只能按顺序使用,不能跳用。(如果不用第一个,就不能用第二个)

例子

分析:

总共建立了三个索引,是联合索引,分别为emp_no,title,from_date

  1. 会用到索引的三个字段
  2. 不会用索引(没用第一个字段,直接用了第二个字段)
  3. 会用索引
  4. 会用一个
  5. 会用

索引优化原则

最左前缀原则

由于联合索引会先按第一个字段比较,然后第二,然后第三。因此,如果查询语句的查询条件里没有第一个字段,只有二三,则不会运用联合索引。会遍历表逐行判断。

同理,只有1,3字段也不行。想用联合索引,查询语句的判断条件中必须包含从第一个字段开始的连续字段。

这就是最左前缀法则。即联合索引用了三个字段abc,则查询条件也要是a=,b=,c=或者a=,b=。即查询条件顺序必须和联合索引顺序相同

Author: Shuchen
Link: http://yoursite.com/2019/12/20/MySQL%E7%AC%94%E8%AE%B0%E4%B9%8B%E4%BA%8C%E7%B4%A2%E5%BC%95%E5%BB%BA%E7%AB%8B%E5%92%8C%E4%BC%98%E5%8C%96/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.