Mysql超大分页优化处理
Mysql超大分页怎么优化处理
1)数据库层面,这也是我们主要集中关注的(虽然收效没那么大),类似于
select * from table where age > 20 limit 1000000,10
这种查询其实也是有可以优化的余地的. 这条语句需要load1000000数据然后基本上全部丢弃,只取10条当然比较慢. 当时我们可以修改为
select * from table where id in (select id from table where age > 20 limit 1000000,10)
这样虽然也load了一百万的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度会很快. 同时如果ID连续的好(自增id连续),我们还可以
select * from table where id > 1000000 limit 10
效率也是不错的,优化的可能性有许多种,但是核心思想都一样,就是减少load的数据.
2)从需求的角度减少这种请求…主要是不做类似的需求(直接跳转到几百万页之后的具体某一页.只允许逐页查看或者按照给定的路线走,这样可预测,可缓存)以及防止ID泄漏且连续被人恶意攻击
3)分页联表left join优化
select * from sicimike where name like 'c6%' order by id limit 30000, 5;
可改为
select a.* from sicimike a inner join (select id from sicimike where name like 'c6%' order by id limit 30000, 5) b on a.id = b.id;
效果展示
mysql> select a.* from sicimike a inner join (select id from sicimike where name like 'c6%' order by id limit 30000, 5) b on a.id = b.id; +---------+------------+-----+---------------------+ | id | name | age | add_time | +---------+------------+-----+---------------------+ | 7466563 | c6db537243 | 59 | 2020-02-14 13:34:01 | | 7466920 | c62dec7921 | 79 | 2020-02-14 13:34:01 | | 7467162 | c610b89b31 | 71 | 2020-02-14 13:34:01 | | 7467590 | c67bbd4bfd | 10 | 2020-02-14 13:34:01 | | 7467825 | c6db24865b | 51 | 2020-02-14 13:34:01 | +---------+------------+-----+---------------------+ 5 rows in set (0.05 sec) mysql> select * from sicimike where name like 'c6%' order by id limit 30000, 5; +---------+------------+-----+---------------------+ | id | name | age | add_time | +---------+------------+-----+---------------------+ | 7466563 | c6db537243 | 59 | 2020-02-14 13:34:01 | | 7466920 | c62dec7921 | 79 | 2020-02-14 13:34:01 | | 7467162 | c610b89b31 | 71 | 2020-02-14 13:34:01 | | 7467590 | c67bbd4bfd | 10 | 2020-02-14 13:34:01 | | 7467825 | c6db24865b | 51 | 2020-02-14 13:34:01 | +---------+------------+-----+---------------------+ 5 rows in set (2.26 sec)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2018-07-10 php 数组操作
2017-07-10 全面解读PHP的Yii框架中的日志功能
2017-07-10 curl 异步捉取数据类
2017-07-10 微信企业号OAuth2.0验证接口来获取成员的身份信息