一次900万+数据量的 SQL 查询优化分析

作者:微信小助手

发布时间:2020-01-26T10:56:14

祝大家新年快乐,在新的一年里,工作顺利,身体健康,万事如意!

另外,最近大家没有特别重要的事情不要出门了,尽量在家呆着,减少与他人接触出门一定记得带有防护作用的口罩,注意安全!保护好自己!保护好你的家人!
加油武汉!加油中国!
往期热门文章:

1、往期精选优秀博文都在这里了!

2、7 款神秘的开源中间件!

3、MyBatis她不香吗?为啥老外却喜欢Hibernate/Jpa?

4、代码对比工具,我就用这7个!

5、Mybatis 中经典的 9 种设计模式!面试可以吹牛了!

来源 :

https://www.jianshu.com/p/0768ebc4e28d


有一张流水表,未分库分表,目前的数据量为950w,分页查询使用到了limit,优化之前的查询耗时167s左右 (execution: 16s831ms, fetching: 107 ms)

按照下文的方式调整SQL后,耗时347ms (execution: 163 ms, fetching: 184 ms);优化前的SQL类似这样:

-- 优化前SQL
SELECT  各种字段
FROM `table_name`
WHERE 各种条件
LIMIT 0,10;


优化后SQL是这样的(这种优化手段在高性能MySQL中有提及):


-- 优化后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的版本:

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 | |