加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_梅州站长网 (https://www.0753zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

浅谈MySQL索引

发布时间:2022-11-29 12:44:33 所属栏目:MySql教程 来源:
导读:  索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。索引可以包含一个或多个列的值,如果索引包含多个列的值,则列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列。

  索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。索引可以包含一个或多个列的值,如果索引包含多个列的值,则列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列。
 
  B+树索引(InnoDB)
 
  在B+树中,所有记录节点存放在叶子节点上且是顺序存放,由各叶子节点指针进行连接。如果从最左边的叶子节点开始顺序遍历,能得到所有键值的顺序排序。使用B+树存储数据可以让一个查询尽量少的读磁盘,从而减少查询时磁盘I/O的时间。
 
  在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。每一个索引在 InnoDB 里面对应一棵 B+ 树。
 
  主键索引和非主键索引
 
  主键索引的叶子结点存的是整条记录,主键索引也被称为聚簇索引。
 
  非主键索引的叶子结点存的是主键的值,非主键索引也被称为二级索引/普通索引/辅助索引。基于非主键索引的查询需要多扫描一棵索引树。
 
  1)在应用中应该尽量使用主键查询。
 
  2)因为非主键索引树的叶结点存放的是主键的值,应该考虑让主键的字段尽量短,这样非主键索引的叶子结点就越小,非主键索引占用的空间也就越小。一般情况下,建议创建一个自增主键,这样非主键索引占用的空间最小。
 
  联合索引
 
  MySQL中的索引可以以一定顺序引用多列,这种索引叫作联合索引。
 
  最左原则
 
  联合索引(a, b)是根据a, b进行排序(先根据a排序,如果a相同则根据b排序)。查询的时候查询条件精确匹配索引的左边连续一列或几列mysql表索引,才能命中索引。
 
  最左原则原理
 
  联合索引的底层是一颗B+树,联合索引的B+树节点中存储的是键值。由于构建一棵B+树只能根据一个值来确定索引关系,所以数据库依赖联合索引最左的字段来构建。
 
  注意
 
  查询的时候如果两个条件都用上了,但是顺序不同,那么现在的查询引擎会自动优化为匹配联合索引的顺序,这样是能够命中索引的。
 
  由于最左前缀原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数,较多的放前面。ORDER BY子句也遵循此规则。
 
  回表
 
  select * from T where k between 3 and 5;
  则这条SQL语句的执行流程如下:
 
  在 k 索引树上找到 k=3 的记录,取得 ID = 300;再到 ID 索引树查到 ID=300 对应的数据;在 k 索引树取下一个值 k=5,取得 ID=500;再回到 ID 索引树查到 ID=500 对应的 数据;在 k 索引树取下一个值k=6,不满足条件,循环结束。
 
  在这个过程中,回到主键索引树的过程,称为回表。由于查询的结果是所有字段,所需要的数据只有主键上才有,所以不得不回表。
 
  select ID from T where k between 3 and 5;
  由于查询的值是ID,而ID的值已经在k索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里,索引k已经“覆盖了”我们的查询需求,故称为覆盖索引。
 

(编辑:云计算网_梅州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!