MySQL 原理与优化之Limit 查询优化


Posted in MySQL onAugust 14, 2022

MySQL 原理与优化之Limit 查询优化

假设有表tb_sku,其表结构如下:

MySQL 原理与优化之Limit 查询优化

表中大约有200w条记录,执行如下的sql 语句大约 4.36s 返回数据

select count(*) from tb_sku;

MySQL 原理与优化之Limit 查询优化

接着我们使用 对其进行分页查找:

select * from tb_sku limit 0,10;

limit 语句 其中0 代表起始位置,10 为每页返回的数据数量。

MySQL 原理与优化之Limit 查询优化

如上图所示,很快就返回了查询结果。

接着我们再使用SQL 语句

select * from tb_sku limit 10,10;

语句从记录位置10的位置开始再往下返回10 条记录,也就是第二页的信息。其返回时间也是比较快。

然后,我们加大起始位置 到100w如下:

select * from tb_sku limit 1000000,10;

MySQL 原理与优化之Limit 查询优化

此时返回时间需要0.74 s,这说明了使用limit 对大数据量的表进行分页,位置越靠后效率越低。拿上面的例子来说,limit 会先对 100w 的数据进行排序,然后再返回10 条数据,而且仅仅返回100w 到 100w 零10条 的记录,其他查询的记录都会丢弃掉,这种做法查询排序的代价非常大。

由此我们需要对大数据量表进行limit 操作进行优化,官方给出的方案是通过覆盖索引和子查询的方式进行优化

根据这个思路首先对id 进行查询:

select id from tb_sku order by id limit 1000000,10;

MySQL 原理与优化之Limit 查询优化

查询结果就只需要0.34s 比之前的0.74s要快多了。究其原因,因为直接返回id的信息,并没有进行回表操作,所以速度别select * 要快

由于我们需要获得select * 的信息,也就是tb_user 所有字段的信息,因此需要将上面的查询结果和tb_user 进行jion 操作。

select s.* from tb_sku s ,(select id from tb_sku order by id limit 1000000,10 ) t where s.id = t.id;

MySQL 原理与优化之Limit 查询优化

这里通过查询id 和子查询 的方式将查询结果缩短为 0.38s,比之前直接通过 select * 的方式要缩短一倍的查询时间。

到此这篇关于MySQL 原理与优化之Limit 查询优化的文章就介绍到这了,更多相关MySQL Limit 优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql字符串截取函数小结
Apr 05 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
MySQL 用 limit 为什么会影响性能
Sep 15 MySQL
将MySQL的表数据全量导入clichhouse库中
Mar 21 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
单机多实例部署 MySQL8.0.20
May 15 MySQL
mysql sock 文件解析及作用讲解
Jul 15 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 #MySQL
mysql函数之截取字符串的实现
Aug 14 #MySQL
MySQL 原理与优化之原数据锁的应用
MySql按时,天,周,月进行数据统计
Aug 14 #MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 #MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 #MySQL
MySQL数据库查询之多表查询总结
Aug 05 #MySQL
You might like
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
幼儿园新学期寄语
2014/01/18 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
新学期感想
2015/08/10 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android