服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|

MySQL查询中LIMIT的大offset导致性能低下浅析

2019-06-14 10:13来源:craneyuan所属分类:Mysql

这篇文章主要给大家介绍了关于MySQL查询中LIMIT的大offset导致性能低下的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

我们大家都知道,mysql查询使用select命令,配合limit,offset参数可以读取指定范围的记录,但是offset过大影响查询性能的原因及优化方法

我们在业务系统中难免少不了分页的需求。想到分页的时候,大家肯定会想到使用SQL中的LIMIT来实现。但是,如果不正确的使用LIMIT会导致性能问题(SQL执行得很慢、有可能会拖垮服务器),也会被领导批的;所以,我们来看看如何正确地使用LIMIT。

下面话不多说了,来一起看看详细的介绍吧

LIMIT OFFSET, ROW_COUNT 实现分页

存在性能问题的方式

SELECT * FROM myTable ORDER BY `id` LIMIT 1000000, 30 

写出这样SQL语句的人肯定心里是这样想的:MySQL数据库会直接定位到符合条件的第1000000位,然后再取30条数据。
然而,实际上MySQL不是这样工作的。

LIMIT 1000000, 30 的意思是:扫描满足条件的1000030行,扔掉前面的1000000行,然后返回最后的30行。

较好的方式

SELECT t.*
FROM (
  SELECT id
  FROM myTable
  ORDER BY
    id
  LIMIT 1000000, 30
  ) q
JOIN myTable t
ON  t.id = q.id

大概的原理是:

  • 子查询只用到了索引列,没有取实际的数据,所以不涉及到磁盘IO,所以即使是比较大的 offset,查询速度也不会太差。

对具体的原理分析感兴趣的朋友可以看看这篇文章:MySQL ORDER BY / LIMIT performance: late row lookups

后记

未完待续。

参考资料

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

延伸 · 阅读

精彩推荐
  • MysqlCan't connect to local MySQL through socket '/tmp/mysql.sock'解决方法

    Can't connect to local MySQL through socket '/tmp/mysql.sock'解决方法

    今天小编就为大家分享一篇关于Can't connect to local MySQL through socket '/tmp/mysql.sock'解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    芽孢八叠球菌 144 2019-06-02
  • Mysqlmysql8.0.14.zip安装时自动创建data文件夹失败服务无法启动

    mysql8.0.14.zip安装时自动创建data文件夹失败服务无法启动

    这篇文章主要介绍了mysql8.0.14.zip安装时自动创建data文件夹失败,导致服务无法启动的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    zzjba19z 405 2019-06-05
  • MysqlMysql树形递归查询的实现方法

    Mysql树形递归查询的实现方法

    这篇文章主要给大家介绍了关于Mysql树形递归查询的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...

    javahih 241 2019-06-06
  • MysqlMysql事务隔离级别之读提交详解

    Mysql事务隔离级别之读提交详解

    这篇文章主要介绍了Mysql事务隔离级别之读提交详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    旧梦发癫 410 2019-06-10
  • MysqlUbuntu18.04安装mysql5.7.23的教程

    Ubuntu18.04安装mysql5.7.23的教程

    这篇文章主要为大家详细介绍了Ubuntu18.04安装mysql5.7.23的教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    登峰小蚁 275 2019-06-05
  • MysqlMySQL 8.0.13设置日期为0000-00-00 00:00:00时出现的问题解决

    MySQL 8.0.13设置日期为0000-00-00 00:00:00时出现的问题解决

    这篇文章主要介绍了MySQL 8.0.13设置日期为0000-00-00 00:00:00时出现的问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Magicer 454 2019-06-10
  • MysqlMySQL InnoDB 二级索引的排序示例详解

    MySQL InnoDB 二级索引的排序示例详解

    这篇文章主要给大家介绍了关于MySQL InnoDB 二级索引的排序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    coderbee笔记 111 2019-06-11
  • MysqlMySQL中字段类型char、varchar和text的区别

    MySQL中字段类型char、varchar和text的区别

    今天小编就为大家分享一篇关于MySQL中字段类型char、varchar和text的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    CODETC 375 2019-06-01