一、背景

我们在开发的过程中使用分页是不可避免的,通常情况下我们的做法是使用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分页查询慢的原因及解决方案相关推荐

  1. mysql 前30秒_mysql – 简单查询需要15-30秒

    以下查询非常简单.它从消息表中选择最后20条记录,以便在分页方案中使用.第一次运行此查询时,需要15到30秒.后续运行只需不到一秒钟(我预计会涉及一些缓存).我试图确定为什么第一次这么长时间. 这是查 ...

  2. mysql两个表查询修改_MySQL:查询、修改(二)

    干货: 使用SELECT查询的基本语句SELECT * FROM 可以查询一个表的所有行和所有列的数据.SELECT查询的结果是一个二维表. 使用SELECT *表示查询表的所有列,使用SELECT ...

  3. mysql 慢日志 作用_MySQL慢查询日志的作用和开启

    前言 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.lon ...

  4. mysql 查询重写_mysql 学习 - 查询重写规则

    条件化简 我们编写的查询语句的搜索条件本质上是一个表达式,这些表达式可能比较繁杂,或者不能高效的执行,MySQL的查询优化器会为我们简化这些表达式. 移除不必要的括号 有时候表达式里有许多无用的括号, ...

  5. mysql慢查询单位_MySQL慢查询

    MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句.具体环境中,运行时间超过long_query_time值的SQL语句,则会被记录到慢 ...

  6. mysql or中有空查询慢_MySQL 慢查询日志

    1.定义 2.相关参数 2.开启 3.原因 4.慢查询日志工具mysqldumpslow 1.定义 作用:用来记录在MySQL中响应时间超过阀值的语句. 2.相关参数 mysql> show v ...

  7. mysql 关联查询慢_mysql慢查询语句分析总结

    我们经常会接触到MySQL,也经常会遇到一些MySQL的性能问题.我们可以借助慢查询日志和explain命令初步分析出SQL语句存在的性能问题 通过SHOW FULL PROCESSLIST查看问题 ...

  8. mysql数据库查询笔记_mysql笔记: 查询

    mysql笔记: 查询 查询准备 CREATE DATABASE search; use search; # 学生表(student):学号.姓名.性别.出生日期.班级 CREATE TABLE st ...

  9. mysql workbench 导出查询结果_MySQL Workbench查询结果导出步骤

    MySQL Workbench查询结果导出步骤 发布时间:2020-05-19 16:16:31 来源:PHP中文网 阅读:202 作者:三月 本文主要给大家介绍MySQL Workbench查询结果 ...

  10. c mysql清理日志文件_MySQL 一般查询日志或者慢查询日志历史数据的清理

    general log&slow query log 对于MySQL的一般查询日志和慢查询日志,开启比较简单,其中公用的一个参数是log_output,log_output控制着慢查询和一般查 ...

最新文章

  1. MS:中山大学丁涛/吴忠道-肠道菌群调控血吸虫病传播媒介光滑双脐螺适生性的新机制...
  2. Martin Fowler谈《重构HTML:改善Web应用的设计》
  3. 配置nginx下别名alias支持PHP fastcgi解析
  4. do_page_fault: epc == 00000000, ra == 00000000
  5. 微软重新开源 MS-DOS 1.25/2.0:已诞生 36 年
  6. 【NLP】fastText词向量与文本分类工具
  7. 改2003远程端口3389的方法!
  8. Go 如何利用multipart/form-data实现文件的上传与下载
  9. Java几款性能分析工具的对比
  10. Linux服务器时间快8个小时,Linux系统时间快8小时解决方案
  11. 服务应用突然宕机了?别怕,Dubbo 帮你自动搞定服务隔离!
  12. 单点登录系统原理与接入
  13. 人脸检测FDDB评测的详细步骤
  14. 计算机五笔是什么时候学的吗,现在还有人学五笔么
  15. python appium连接安卓真机测试
  16. 【CSDN英雄会】黄帅:安全不是独行侠而是系统性的运维过程
  17. 关于取地址运算符以及指针10要点
  18. 给VB.NET开发者的46个忠告
  19. android notify() notifyAll()的区别
  20. 微信小程序组件、web-view、h5之间交互

热门文章

  1. 百度AI开放平台—简单步骤介绍(多图警告)
  2. 在线图书销售系统顺序图_苏宁易购网上商城在线购物
  3. VS2015如何添加头文件
  4. PLSQL Developer 13链接oracle安装与配置手册
  5. cropper.js 裁剪图片并上传(文档翻译+demo)
  6. struts2与struts1区别二
  7. atoll C语言实现
  8. [11]ESP32+三轴磁罗盘HMC5883L移植与调试
  9. 测量MATLAB安装哪些产品,matlab需要安装哪些工具箱
  10. 撰写美国作业使用APA与MLA格式的区别是什么?