我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql优化-减少查询回表次数和回表数据量

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql优化-减少查询回表次数和回表数据量

减少数据回表常见的三种方式分别是1)查询条件使用聚集索引;2)使用索引下推;3)使用索引覆盖。

1 查询条件使用聚集索引-避免回表查询

按照索引使用数据结构B+树叶子结点是否包含表中全部字段,mysql 索引可以分为聚集索引和非聚集索引(辅助索引),聚集索引反应了记录在磁盘上存储的物理结构,辅助索引反应了记录的逻辑结构。聚集索引索引B+树叶子结点存储表所有字段属于聚集索引,查询索引可以直接获得所有字段信息,索引B+树叶子结点只存储聚集索引id,根据辅助索引查询全部字段时,首先根据辅助索引,查询到聚集索引,然后根据查询到的聚集索引id逐个回表查询记录完整信息。综上,使用聚集索引查询不用二次回表。

2 使用索引覆盖-避免回表查询

先有如下一个订单表,考虑需要经常查询某个用户购买某个商品的信息,所以设计了联合主键(user_id, spu_id)。

CREATE TABLE `order` (     `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID', `spu_id` bigint(20) unsigned NOT NULL COMMENT 'SPUID', ... KEY `idx_userId_spuId` (`userId`,`spu_id`) USING BTREE) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='订单';

现需要查询一个用户下的所有spu_id:

select * from `order` where `user_id` = 123456; -- 方式1,从表中查询整条记录,然后在后端代码中提取spu_idselect `spu_id` from `order` where `user_id` = 123456; -- 方式2,只查询spu_id字段

相同点是,在数据量很大情况下,两种方式都会走索引idx_userId_spuId;不同点是,方式1,先根据辅助索引找到主键id(此时聚集索引建立在主键上),然后对每个主键id进行回表查询整条记录信息,方式2,因为联合索引恰好包含查询字段spu_id,避免了二次回表查询。

3 使用索引下推-减少回表次数

下面是一个用户表,同时在用户姓名和年龄创建了一个联合索引

CREATE TABLE `user_info` (     `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(512) unsigned NOT NULL COMMENT '姓名', `age` bigint(20) unsigned NOT NULL COMMENT '年龄', ... KEY `idx_name_age` (`name`,`age`) USING BTREE) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='用户信息';

先需要查询18岁以下所有姓张的同学信息(场景好奇快😂):

select * from `user_info` where name like '张' and age < 18;

在mysql 5.6 之前,查询过程使用idx_name_age索引查询主键id,然后根据主键逐个回表(没在联合索引上使用age < 8条件,是使用联合索引字段作为查询条件,遇到非等值查询联合索引后续字段会失效),同时使用age < 8条件进行过滤,回表记录可能会因为age条件而在最终结果中过滤掉,这样,其实被过滤的记录要是不用回表可以减少二次回表次数,提高查询效率。在mysql 5.7 引入「索引下推」,查询过程变成,name走索引idx_name_age,同时继续直接使用age对索引进行过滤,需要回表查询的小部分记录都会包含在最终结果里面。
note:order by 中排序字段可以和where中查询字段都被包含在联合索引中,也可能引起索引下推。

参考:

1 Mysql优化(十)什么是 MySQL 的 回表 ?怎么减少回表的次数?
2 MySQL聚集索引和非聚集索引
3 主键,聚集索引,不是一个东西!
4 Mysql性能优化:什么是索引下推?
在这里插入图片描述

来源地址:https://blog.csdn.net/huhu123444/article/details/130406967

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql优化-减少查询回表次数和回表数据量

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

减少网页重绘和回流的次数:优化网页性能的方法

优化网页性能:如何减少重绘和回流的次数?随着互联网的发展,网页性能优化成为了开发者们关注的重要问题之一。在网页加载过程中,重绘和回流是影响性能的两大主要因素。本文将介绍如何减少重绘和回流的次数,并提供一些具体的代码示例。使用合适的CSS
减少网页重绘和回流的次数:优化网页性能的方法
2024-01-26

Mysql分表查询海量数据和解决方案

众所周知数据库的管理往往离不开各种的数据优化,而要想进行优化通常我们都是通过参数来完成优化的。那么到底这些参数有哪些呢?为此在本篇文章中编程学习网笔者就为大家简单介绍MySQL,以供大家参考参考,希望能帮助到大家。以上就是关于大数据的知识点了。喜欢的可以分享给你的朋友,也可以点赞噢~更多内容,就在编程学习网!
Mysql分表查询海量数据和解决方案
2024-04-23

mysql数据库多表关联查询的慢SQL优化

工作中我们经常用到多个left join去关联其他表查询结果,但是随着数据量的增加,一个表的数据达到百万级别后,这种普通的left join查询将非常的耗时。 举个例子:     现在porder表有 1000W数据,其他关联的表数据都很少,因为条件的限制 必
mysql数据库多表关联查询的慢SQL优化
2017-02-16

表单生成器(Form Builder)之mongodb表单数据查询——返回分页数据和总条数 - du

上一篇笔记将开始定义的存储结构处理了一下,将FormItems数组中的表单项都拿到mongodb document的最外层,和以前的关系型数据类似,之不过好多列都是动态的,不固定,不过这并没有什么影响。结果就是方便我们更好的查询和统计;还有一点就是转换之后从服
表单生成器(Form Builder)之mongodb表单数据查询——返回分页数据和总条数 - du
2018-10-14

如何通过索引优化PHP与MySQL的跨表查询和跨数据库查询?

引言:在面对需要处理大量数据的应用程序开发中,跨表查询和跨数据库查询是不可避免的需求。然而,这些操作对于数据库的性能来说是非常消耗资源的,会导致应用程序变慢甚至崩溃。本文将介绍如何通过索引优化PHP与MySQL的跨表查询和跨数据库查询,从而
2023-10-21

怎么在mysql中优化百万级数据表的查询

怎么在mysql中优化百万级数据表的查询?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.两种查询引擎查询速度(myIsam 引擎 )InnoDB 中不保存表的
2023-06-15

如何通过索引优化PHP与MySQL的复杂查询和大数据量查询?

引言:随着互联网的快速发展,数据量的爆炸式增长成为了一个普遍的问题。对于使用PHP和MySQL进行复杂查询和处理大数据量的项目来说,索引优化是提高查询性能和响应时间的重要手段之一。本文将介绍几种常见的索引优化技巧,以及详细的代码示例。一、了
2023-10-21

Swoole和Workerman对PHP与MySQL的大数据量查询和传输的优化方法

一、Swoole对PHP与MySQL大数据量查询和传输的优化方法:使用协程:Swoole支持协程,通过协程可以实现非阻塞的异步I/O操作,提高查询和传输的效率。使用协程可以避免线程切换的开销,提高并发性能。以下是使用Swoole协程进行My
2023-10-21

PHP与MySQL索引的数据缓存和内存表的优化策略及其对查询性能的影响

引言:在开发和优化数据库驱动的应用程序时,PHP和MySQL是非常常见的组合。而在PHP与MySQL的交互中,索引的数据缓存和内存表的优化策略对于提高查询性能起着至关重要的作用。本文将介绍关于PHP与MySQL索引的数据缓存和内存表的优化策
2023-10-21

编程热搜

目录