前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql慢查询优化-分页慢查询篇

mysql慢查询优化-分页慢查询篇

作者头像
零式的天空
发布2022-03-27 16:14:46
3.1K0
发布2022-03-27 16:14:46
举报
文章被收录于专栏:零域Blog

前提介绍

为何分页查询在测试环境没事,在生产上几千万的数据就出现了问题 在平时开发时,由于数据量没有那么大,所以测试有时候会不到位,比如用到的分页查询,使用不规范时,数据量越大,查询越慢,而且有 长时间进程不结束,会导致内存不足等风险

传统分页查询:SELECT c1,c2,cn… FROM table LIMIT n,m

MySQL的limit工作原理就是先读取前面n条记录,然后抛弃前n条,读后面m条想要的,所以n越大,偏移量越大,性能就越差。 因为要取出所有字段内容,这种需要跨越大量数据块并取出

推荐分页查询方法 通过直接根据索引字段定位后,才取出相应内容,效率自然大大提升。对limit的优化,不是直接使用limit,而是首先获取到offset的id,然后直接使用limit size来获取数据。

1、尽量给出查询的大致范围

代码语言:javascript
复制
SELECT c1,c2,cn… FROM table WHERE id>=20000 LIMIT 10;

2、子查询法

代码语言:javascript
复制
SELECT c1,c2,cn… FROM table WHERE id>=
(
SELECT id FROM table LIMIT 20000,1
)
LIMIT 10;

3、子查询2

代码语言:javascript
复制
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id

3、高性能MySQL一书中提到的只读索引方法

优化前SQL:

代码语言:javascript
复制
SELECT c1,c2,cn… FROM member ORDER BY last_active LIMIT 50,5

优化后SQL:

代码语言:javascript
复制
SELECT c1, c2, cn .. .
FROM member
INNER JOIN (SELECT member_id FROM member ORDER BY last_active LIMIT 50, 5)
USING (member_id)

分别在于,优化前的SQL需要更多I/O浪费,因为先读索引,再读数据,然后抛弃无需的行。而优化后的SQL(子查询那条)只读索引(Cover index)就可以了,然后通过member_id读取需要的列。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提介绍
    • 1、尽量给出查询的大致范围
      • 2、子查询法
        • 3、子查询2
          • 3、高性能MySQL一书中提到的只读索引方法
          相关产品与服务
          云数据库 SQL Server
          腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档