| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 记一次线上sql优化从9s到400ms的过程 -> 正文阅读 |
|
[大数据]记一次线上sql优化从9s到400ms的过程 |
? ? 最近线上发版的时候,发现有个接口执行特别慢,前端App的表现就是没有任何的反应,然后从pinpoint上追查接口发现是sql执行特别慢,平均都是在9s左右。这里由于使用了分页查询的 Mybatis interceptor所以同样的sql还需要查询一次count,导致整个耗时在9s左右,单个sql的耗时在5-6秒左右。 ? ? 线上有一张订单表数据大概是65万条数据,另一张订单配送任务表数据大概也是65万条数据,有一条sql的 inner join两张表,执行的sql大致如下: ?基于我对join优化的本能(join优化分析博客:Mysql - join(索引和非索引)的实现原理和优化手段也可以参考:https://www.processon.com/view/link/5ff1684ee0b34d19e4f89031),首先想到的就是是否使用了 Index Nested Loop Join,但是一看两个join on的字段都是有索引的。就先看了一下执行计划,如下: ? ? 该执行计划显示一张 65万的数据走了全表扫描,使用了临时表、使用了排序(注意这里写的 filesort可能是内存排序不一定是文件排序)。出于本能我想到了将小表作为驱动表,但是本能也是将两张表的位置进行了交互,但是发现效果没有太大区别。 ? ? 我们赶快翻我写的processon上的优化注意点,试着将 inner join换成了 straght_join,就这一个小小的改动整个耗时从 6s变成了 400ms,我一下子就懵了,马上看了一下执行计划,如下: ?两个表的 ALL、ref变成了 eq_ref、ref,并且两个的key都使用了索引,Extra这里没有了临时表,增加了 Usingwherecondition。事后翻盘如果是两个表的数据相差很大这个效果是接受的,但是两个表的数据量都相当,这个性能提升和执行计划还是有点懵的,希望高手帮解惑。 ?在列一下从pinpoint上看到的使用 inner join和 straight_join的性能对比: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 13:35:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |