mysql分页查询非常慢_MySQL分页查询慢的原因及解决方案
一、背景
我们在开发的过程中使用分页是不可避免的,通常情况下我们的做法是使用limit加偏移量:select * from table where column=xxx order by xxx limit 1,20。当数据量比较小时(100万以内),无论你翻到哪一页,性能都是很快的。如果查询慢,只要在where条件和order by 的列上加上索引就可以解决。但是,当数据量大的时候(小编遇到的情况是500万数据),如果翻到最后几页,即使加了索引,查询也是非常慢的,这是什么原因导致的呢?我们该如何解决呢?
二、limit分页原理
当我们翻到最后几页时,查询的sql通常是:select * from table where column=xxx order by xxx limit 1000000,20。查询非常慢。但是我们查看前几页的时候,速度并不慢。这是因为limit的偏移量太大导致的。MySql使用limit时的原理是(用上面的例子举例):
MySQL将查询出1000020条记录。
然后舍掉前面的1000000条记录。
返回剩下的20条记录。
上述的过程是在《高性能MySQL》书中确认的。
三、解决方案
解决的方法就是尽量使用索引覆盖扫描,就是我们select后面检出的是索引列,而不是所有的列,而且这个索引的列最好是id。然后再做一次关联查询返回所有的列。上述的sql可以写成:
SELECT
*
FROM
table t
INNER JOIN (
SELECT
id
FROM
table
WHERE
xxx_id = 143381
LIMIT 800000,20
) t1 ON t.id = t1.id
我们在 mysql 中做的真实的实验:
上图是没有优化过的sql,执行时间为2s多。经过优化后如下:
执行时间为0.3s,性能有了大幅度的提升。虽然做了优化,但是随着偏移量的增加,性能也会随着下降,MySql官方虽然也给出了
其他的解决方案,但是在实际开发中很难使用。
有的同学可能会问,能不能使用IN嵌套子查询,而不使用INNER JOIN的方式,答案是不可以,因为MySql在子查询中不能使用LIMIT。
MySQL分页优化就先介绍到这里了。
mysql分页查询非常慢_MySQL分页查询慢的原因及解决方案相关推荐
- mysql 前30秒_mysql – 简单查询需要15-30秒
以下查询非常简单.它从消息表中选择最后20条记录,以便在分页方案中使用.第一次运行此查询时,需要15到30秒.后续运行只需不到一秒钟(我预计会涉及一些缓存).我试图确定为什么第一次这么长时间. 这是查 ...
- mysql两个表查询修改_MySQL:查询、修改(二)
干货: 使用SELECT查询的基本语句SELECT * FROM 可以查询一个表的所有行和所有列的数据.SELECT查询的结果是一个二维表. 使用SELECT *表示查询表的所有列,使用SELECT ...
- mysql 慢日志 作用_MySQL慢查询日志的作用和开启
前言 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.lon ...
- mysql 查询重写_mysql 学习 - 查询重写规则
条件化简 我们编写的查询语句的搜索条件本质上是一个表达式,这些表达式可能比较繁杂,或者不能高效的执行,MySQL的查询优化器会为我们简化这些表达式. 移除不必要的括号 有时候表达式里有许多无用的括号, ...
- mysql慢查询单位_MySQL慢查询
MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句.具体环境中,运行时间超过long_query_time值的SQL语句,则会被记录到慢 ...
- mysql or中有空查询慢_MySQL 慢查询日志
1.定义 2.相关参数 2.开启 3.原因 4.慢查询日志工具mysqldumpslow 1.定义 作用:用来记录在MySQL中响应时间超过阀值的语句. 2.相关参数 mysql> show v ...
- mysql 关联查询慢_mysql慢查询语句分析总结
我们经常会接触到MySQL,也经常会遇到一些MySQL的性能问题.我们可以借助慢查询日志和explain命令初步分析出SQL语句存在的性能问题 通过SHOW FULL PROCESSLIST查看问题 ...
- mysql数据库查询笔记_mysql笔记: 查询
mysql笔记: 查询 查询准备 CREATE DATABASE search; use search; # 学生表(student):学号.姓名.性别.出生日期.班级 CREATE TABLE st ...
- mysql workbench 导出查询结果_MySQL Workbench查询结果导出步骤
MySQL Workbench查询结果导出步骤 发布时间:2020-05-19 16:16:31 来源:PHP中文网 阅读:202 作者:三月 本文主要给大家介绍MySQL Workbench查询结果 ...
- c mysql清理日志文件_MySQL 一般查询日志或者慢查询日志历史数据的清理
general log&slow query log 对于MySQL的一般查询日志和慢查询日志,开启比较简单,其中公用的一个参数是log_output,log_output控制着慢查询和一般查 ...
最新文章
- MS:中山大学丁涛/吴忠道-肠道菌群调控血吸虫病传播媒介光滑双脐螺适生性的新机制...
- Martin Fowler谈《重构HTML:改善Web应用的设计》
- 配置nginx下别名alias支持PHP fastcgi解析
- do_page_fault: epc == 00000000, ra == 00000000
- 微软重新开源 MS-DOS 1.25/2.0:已诞生 36 年
- 【NLP】fastText词向量与文本分类工具
- 改2003远程端口3389的方法!
- Go 如何利用multipart/form-data实现文件的上传与下载
- Java几款性能分析工具的对比
- Linux服务器时间快8个小时,Linux系统时间快8小时解决方案
- 服务应用突然宕机了?别怕,Dubbo 帮你自动搞定服务隔离!
- 单点登录系统原理与接入
- 人脸检测FDDB评测的详细步骤
- 计算机五笔是什么时候学的吗,现在还有人学五笔么
- python appium连接安卓真机测试
- 【CSDN英雄会】黄帅:安全不是独行侠而是系统性的运维过程
- 关于取地址运算符以及指针10要点
- 给VB.NET开发者的46个忠告
- android notify() notifyAll()的区别
- 微信小程序组件、web-view、h5之间交互