购物商城网站开发腾讯云获取WordPress密码
web/
2025/9/25 22:44:04/
文章来源:
购物商城网站开发,腾讯云获取WordPress密码,上海网站建设工资多少,石油网站建设价格写在前面在MySQL数据库中#xff0c;索引对查询的速度有着至关重要的影响#xff0c;理解索引也是进行数据库性能调优的起点#xff0c;索引就是为了提高数据查询的效率。今天我们来聊聊在MySQL索引优化中两种常见的方式#xff0c;索引覆盖和索引下推索引覆盖要了解索引覆… 写在前面在MySQL数据库中索引对查询的速度有着至关重要的影响理解索引也是进行数据库性能调优的起点索引就是为了提高数据查询的效率。今天我们来聊聊在MySQL索引优化中两种常见的方式索引覆盖和索引下推索引覆盖要了解索引覆盖需要先了解几个索引的基础知识B树索引B树索引是InnoDB中的一种很常见的索引类型。关于B树这里不做深入的介绍不太清楚的小胖友可以看单独介绍B树、B树的文章。简单来说是因为使用B树存储数据可以让一个查询尽量少的读磁盘从而减少查询时磁盘I/O的时间。在 InnoDB 中表都是根据主键顺序以索引的形式存放的这种存储方式的表称为索引组织表。InnoDB 使用了 B 树索引模型所以数据都是存储在 B 树中的。每一个索引在 InnoDB 里面对应一棵 B 树。举例说明假设我们有一张表该表主键为id且有用户名(user_name)和用户年龄(age)两个字段其中age字段上有索引所以建表语句如下图所示表中有5条数据基于上面这种表设计和表中的数据在InnoDB中的索引结构是下面这个样子的根据叶子节点的内容索引的类型分为主键索引和非主键索引主键索引的叶子结点存的是整条记录如上图紫色部分所示非主键索引的叶子结点存的是主键的地址值根据二级索引叶子结点中的地址可以找到主键索引中的这一条数据。所以非主键索引也被称为二级索引如上图右半边黄色部分所示那主键索引、二级索引的概念和我们今天介绍的内容有什么关系呢我们下面来具体说说回表根据刚才提供的表结构我们尝试来做两次次这样的查询select *from lyb_test where id 2select *from lyb_test where age 12第一条语句使用主键作为检索条件即为主键查询根据上图所示我们知道如果是主键查询我们只需要搜索左边这颗主键索引树即可快速查询到id2的这条数据第二条语句使用的是二级索引、即age作为检索条件这和主键查询有什么区别呢如果是二级索引查询则需要先搜索左侧的age索引树得到id的值为2再到右侧的主键索引树搜索一次。像第二种查询语句这样通过非主键索引查询数据时我们先通过非主键索引树查找到主键值,然后再在主键索引树搜索一次(根据rowid再次到数据块里取数据的操作)这个过程称为回表也就是说非主键索引查询会比主键查询多搜索一棵树索引覆盖结合上面的知识储备我们进一步来优化一下刚才的SQLselect *from lyb_test where age 12当这条语句执行时我们知道会进行两次索引树查询第一次在二级索引上查询到主键索引的引用然后到主键索引树中查询到所需要的数据这个过程我们称之为回表。那为什么要有回表操作呢由于查询的结果是所有字段所需要的数据只有主键上才有所以不得不回表。我们如果将sql改造为下面这种方式select id from lyb_test where age 12由于查询的值是ID而id的值已经在age索引树上了因此可以直接提供查询结果不需要回表。也就是说当SQL语句的所有查询字段(select列)和查询条件字段(where子句)全都包含在一个索引中便可以直接使用索引查询而不需要回表。即在这个查询里索引age已经“覆盖了”我们的查询需求故称为索引覆盖。索引下推还是基于刚才的表结构和数据我们现在针对user_name和age建立联合索引索引建立之后查询姓名以b开头且年龄大于等于13的用户信息SQL语句如下select * from user_table where username like b% and age 13语句的执行过程有两种可能性根据(usernameage)联合索引查询所有满足名称以b开头的索引然后回表查询出相应的全行数据再筛选出满足年龄大于等于13的用户数据。如果表中user_name以b开头的数据有n条则需要回表n次根据(username,age)联合索引查询所有满足名称以b开头的索引然后直接再筛选出年龄大于等于13的索引之后再回表查询全行数据。经过两次筛选之后回表次数一定小于上述第一种情况我们把第二种语句执行的过程称之为索引下推在MySQL中索引下推是默认启用的状态。在使用InnoDB存储引擎的数据表中索引下推只能用于二级索引。我们可以通过修改MySQL系统变量来控制索引下推是否开启。设置如下SET optimizer_switch index_condition_pushdownoff;// 关闭SET optimizer_switch index_condition_pushdownon;// 开启索引下推一般可用于所求查询字段(select列)不是/不全是联合索引的字段查询条件为多条件查询且查询条件子句(where/order by)字段全是联合索引。假设表t有联合索引(a,b),下面语句可以使用索引下推提高效率select * from t where a 2 and b 10上述就是索引覆盖、回表、索引下推的相关概念和使用场景。当然针对MySQL的索引优化还有其他非常多的方式我们可以在之后的文章中讨论。本文到这里就结束啦谢谢小伙伴们的阅读~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81860.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!