面试——深度分页问题的优化

在开发中为了防止一次加载太多数据到内存,对内存占用和IO读取开销太大,一般使用limit关键字进行分页加载数据,在数据量比较大的时候,如果进行limit分页查询,越往后,分页查询的效率越低。

深度分页效率低的原因:
limit m, n 查询过程是数据库的服务层的执行器调用存储引擎从磁盘中读取m+n条记录到服务层,然后服务层根据offset丢掉前m条,保留第[m, m+n],n条结果,并返回给客户端返回,从磁盘中读取m+n条数据就是整个查询过程中耗时的操作。

sql 复制代码
mysql>select from text limit 0, 10;
10 rows in set (0.00 sec)
mysql>select from text limit 9000000, 10;
10 rows in set (11.00 sec)

当在进行分页查询时,如果执行limit 9000000, 10,此时需要排序前9000010条记录,仅仅返回9000000-9000010的记录,其他的记录丢弃,查询排序的代价非常大。

优化:

一般分页查询时,通过使用覆盖索引能够较好的提高性能,可以通过覆盖索引加子查询形式进行优化。通过子查询先获取要获取记录id,然后再通过条件查询去获取

sql 复制代码
select * from text
select id from text order by id limit 9000000, 10
where t.id = a.id
相关推荐
小红的布丁1 天前
Redis存储引擎剖析:从哈希表到智能数据结构
数据库·redis
饮长安千年月1 天前
玄机-第八章 内存马分析-java02-shiro
数据库·安全·web安全·网络安全·应急响应
chxii1 天前
第五章:MySQL DQL 进阶 —— 动态计算与分类(IF 与 CASE WHEN)多表查询
数据库·mysql
9号达人1 天前
接口设计中的扩展与组合:一次Code Review引发的思考
java·后端·面试
Mr_Xuhhh1 天前
五种IO模型与非阻塞IO
数据库
拾零吖1 天前
数据库 - SQL
数据库·sql
百***62851 天前
oracle 12c查看执行过的sql及当前正在执行的sql
java·sql·oracle
不会c嘎嘎1 天前
MySQL -- 库的操作
数据库·mysql
陌上桑花开花1 天前
DBeaver常用配置
数据库
百***87441 天前
MySQL 查看有哪些表
数据库·mysql·oracle