1000w数据,速度提升 60 倍的 SQL 优化方案,太顶了!

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

操作:

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

原理:

1、减少回表操作;

2、可参考《阿里巴巴Java开发手册(泰山版)》第五章-MySQL数据库、(二)索引规约、第7条:

【推荐】利用延迟关联或者子查询优化超多分页场景。

说明:

MySQL并不是挑过offeset行,而是取offset N行,然后返回放弃前offset行,返回N行,那当offset特别大的时候,效率就非常的底下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQL改写。

正例:

先快速定位需要获取的id段,然后再关联:

SELECT a.* FROM 表1 a,(select id from 表1 where 条件 LIMIT 100000,20) b where a.id = b.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的版本:

mysql

THE END
Copyright © 2024 亿华云