来源:jianshu.com/p/0768ebc4e28d

  • 前言

  • 证实

  • 参考资料


有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms),按照下文的方式调整SQL后,耗时347 ms (execution: 163 ms, fetching: 184 ms);

操作: 查询条件放到子查询中,子查询只查主键ID,然后使用子查询中确定的主键关联查询其他的属性字段;

原理: 减少回表操作;

-- 优化前SQL
SELECT  各种字段
FROM `table_name`
WHERE 各种条件
LIMIT 0,10;
-- 优化后SQL
SELECT  各种字段
FROM `table_name` main_tale
RIGHT JOIN
(
SELECT  子查询只查主键
FROM `table_name`
WHERE 各种条件
LIMIT 0,10;
) temp_table ON temp_table.主键 = main_table.主键

找到的原理分析:MySQL 用 limit 为什么会影响性能?

一,前言

首先说明一下MySQL的版本:

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.17    |
+-----------+
1 row in set (0.00 sec)

表结构:

mysql> desc test;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| id     | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| val    | int(10) unsigned    | NO   | MUL | 0       |                |
| source | int(10) unsigned    | NO   |     | 0       |                |
+--------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

id为自增主键,val为非唯一索引。

灌入大量数据,共500万:

mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
|  5242882 |
+----------+
1 row in set (4.25 sec)

我们知道,当limit offset rows中的offset很大时,会出现效率问题:

mysql> select * from test where val=4 limit 300000,5;
+---------+-----+--------+
| id      | val | source |
+---------+-----+--------+
| 3327622 |   4 |      4 |
| 3327632 |   4 |      4 |
| 3327642 |   4 |      4 |
| 3327652 |   4 |      4 |
| 3327662 |   4 |      4 |
+---------+-----+--------+
5 rows in set (15.98 sec)

为了达到相同的目的,我们一般会改写成如下语句:

mysql> select * from test a inner join (select id from test where val=4 limit 300000,5) b on a.id=b.id;
+---------+-----+--------+---------+
| id      | val | source | id      |
+---------+-----+--------+---------+
| 3327622 |   4 |      4 | 3327622 |
| 3327632 |   4 |      4 | 3327632 |
| 3327642 |   4 |      4 | 3327642 |
| 3327652 |   4 |      4 | 3327652 |
| 3327662 |   4 |      4 | 3327662 |
+---------+-----+--------+---------+
5 rows in set (0.38 sec)

时间相差很明显。

为什么会出现上面的结果?我们看一下select * from test where val=4 limit 300000,5;的查询过程:

查询到索引叶子节点数据。根据叶子节点上的主键值去聚簇索引上查询需要的全部字段值。

类似于下面这张图:

像上面这样,需要查询300005次索引节点,查询300005次聚簇索引的数据,最后再将结果过滤掉前300000条,取出最后5条。MySQL耗费了大量随机I/O在查询聚簇索引的数据上,而有300000次随机I/O查询到的数据是不会出现在结果集当中的。

肯定会有人问:既然一开始是利用索引的,为什么不先沿着索引叶子节点查询到最后需要的5个节点,然后再去聚簇索引中查询实际数据。这样只需要5次随机I/O,类似于下面图片的过程:

其实我也想问这个问题。

【案例实战】不会慢 SQL优化?收藏一下这个例子相关推荐

  1. mysql参数优化步骤_MySQL架构优化实战系列4:SQL优化步骤与常用管理命令2(转)

    MySQL架构优化实战系列4:SQL优化步骤与常用管理命令 原文:http://dbaplus.cn/news-11-649-1.html 一.SQL语句优化步骤 1.查看MySQL状态及配置 sho ...

  2. sql 双分区查询_优化案例 | 分区表场景下的SQL优化

    导读 有个表做了分区,每天一个分区. 该表上有个查询,经常只查询表中某一天数据,但每次都几乎要扫描整个分区的所有数据,有什么办法进行优化吗? 一.待优化场景 有一个大表,每天产生的数据量约100万,所 ...

  3. SQL优化实战经典案例分析

    前言 大家好,我是黎杜,今天和大家聊聊SQL优化的场景. SQL调优这块呢,大厂面试必问的.最近金九银十嘛,所以整理了SQL的调优思路,并且附几个经典案例分析. 1.慢SQL优化思路. 慢查询日志记录 ...

  4. SQL优化之六脉神剑

    SQL优化之六脉神剑 DBAplus社群 | 2016-02-03 07:47 本文作者通过身边的案例,详细阐述了SQL优化过程中的种种方法和小窍门,内容丰富且言之有物,希望能让接触到SQL的同学可以 ...

  5. 18000字的SQL优化大全,收藏直接起飞!

    来源:数据分析不是个事儿 很多朋友在做数据分析时,分析两分钟,跑数两小时? 在使用SQL过程中不仅要关注数据结果,同样要注意SQL语句的执行效率. 本文涉及三部分,篇幅较长,建议收藏后翻看: SQL介 ...

  6. 一条SQL引发的“血案”:与SQL优化相关的4个案例

    导读:笔者早年间从事了多年开发工作,后因个人兴趣转做数据库.在长期的工作实践中,看到了数据库工作(特别是SQL优化)面临的种种问题.本文通过几个案例探讨一下SQL优化的相关问题. 作者:马立和 高振娇 ...

  7. 18000 字的 SQL 优化大全,收藏直接起飞!

    导读:很多朋友在做数据分析时,分析两分钟,跑数两小时?在使用SQL过程中不仅要关注数据结果,同样要注意SQL语句的执行效率. 本文涉及三部分,篇幅较长,建议收藏后翻看: SQL介绍 SQL优化方法 S ...

  8. SQL优化万能公式:5 大步骤 + 10 个案例

    前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL就是整个系统性能的瓶颈. ...

  9. 19_clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化

    25.数据查询与写入优化 25.1.分布式子查询优化 25.1.1.分布式表的IN查询示例1(普通IN子查询.IN子查询为本地表) 25.1.2.分布式表的IN查询示例2(普通IN子查询.IN子查询为 ...

  10. 崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析

    2013数据库大会:崔华-基于Oracle的SQL优化案例分析 崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待. 2013年中国数据库技术大会第二天的"Oracle ...

最新文章

  1. 14个最常见的Kafka面试题及答案【转】
  2. idea服务器如何手动加载项目,idea导入本地idea的web项目(服务器用的是tomcat)
  3. electron 前端开发桌面应用
  4. oracle 查看 统计更新时间,oracle查看和更新统计表的信息
  5. es 安装 ik 分词器
  6. ffmpeg API变更 2009-03-01—— 2017-05-09变更
  7. FileUtils工具类常用方法
  8. 华为ensp(telnet)实验
  9. ionic app 开发学习
  10. 欧盟gmp中的计算机系统验证,欧盟GMP中的计算机系统验证
  11. dell emc isilon环境 Windows共享文件下生成.snapshot无法删除
  12. trackmaker翻译_体育翻译滑雪中英对照翻译
  13. 不输给MacBook的win10精确式触摸板
  14. 力扣1024视频拼接
  15. 张三吃饭——竟吃出了HTTP中GET和POST的区别?
  16. 微信输入法语音转文字的设计点
  17. 2009奥巴马的秋季开学演讲稿
  18. Java集合(超详细-含源码)
  19. Android 沉浸式状态栏攻略 让你的状态栏变色吧
  20. 题目1155:鸡兔同笼

热门文章

  1. Springboot使用Actuator健康监控以及可视化界面
  2. Python----第十次作业
  3. Linux命令-结束进程
  4. CANopen协议,上位机开发(C#)
  5. 【北京站】技术沙龙第19期:千万日活量级 iOS 应用背后的技术
  6. 4路红外循迹模块使用教程
  7. 交换机的全trunk模式(native vlan)
  8. 3D打印出活体心脏,AI让你体验登月!|技术前沿洞察
  9. C语言实用小技巧合集(持续更新)
  10. 面试高频算法题补充系列:木棍切割问题