首页 > 数据库 >解决MySQL使用limit偏移量较大效率慢的问题

解决MySQL使用limit偏移量较大效率慢的问题

时间:2022-11-19 09:11:06浏览次数:45  
标签:10 偏移量 查询 limit student MySQL LIMIT id

备注:第二个方法妥妥的

问题描述
在MySQL中,LIMIT OFFSET偏移量特别大时,效率会非常低

如果说LIMIT 1000,10,一个偏移量很小的值,一般是没有问题的。但是,比如说,LIMIT 10000000,10时就有些费劲了,让你等到花儿都谢了是没有问题的。

原因分析:
究其原因,是因为MySQL的查询并非先跳过10000000条,再查询10条,而是先查询再跳过。所以上面例子,要先查询出10000000行之后,再取10条,速度当然很慢,并且跳过的行数越多,会越慢。

解决方案:
方法A,使用索引
可以使用 id > 10000000的方式诱导MySQL使用主键索引。

这样的Where语句MySQL是非常喜欢并且乐于执行的,因为你给到MySQL的是一个范围,它最容易执行的就是有序和范围的查询,这对它来说易如反掌。

当然,使用这个方法需要注意,id最好是连续的,中间的记录没有被物理删除过。如果其中有数据被物理删除过,用在分页场景的话,就看起来不是那么的优雅。当然,大部分数据库的参与者都倾向于逻辑删除。即便是物理删除的话,也可以使用程序去做区分显示,这不是问题。

方法B,迂回战术-延迟关联技巧
这个方法在《高性能MySQL》中也有提到,所谓延迟关联(deferred join),就是通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。原理还是想方设法利用索引的速度,方可以柔克刚。

假设,有一张表保存了学生的名字,然后要执行这样的sql:

select id,name from student limit 1000000,10;

这样执行的效率必然会很慢

将SQL改写:

SELECT id,name FROM student INNER JOIN (SELECT id FROM student LIMIT 1000000,10) stu ON student.id = stu.id;

可以看到,在上述语句的子查询中,“SELECT id FROM student LIMIT 1000000,10”只查询了主键id一个字段,对于这样的索引覆盖情况,查询速度还是可以接受的。就等于说,该子查询只返回了10个id给上级查询。

上级查询接收到这10个id之后,迅速的查询出了“name”字段,速度得到了极大提升。
————————————————
版权声明:本文为CSDN博主「不想写代码的厨子不是好司机」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hellokitty_nba/article/details/123824417

标签:10,偏移量,查询,limit,student,MySQL,LIMIT,id
From: https://www.cnblogs.com/duanweishi/p/16905429.html

相关文章

  • Mysql批量更新性能优化学习
    转自:https://juejin.cn/post/70435968558290698611.更新对表做多行更新的时候通常会遇到以下两种情况:单语句批量更新(updatea=a+1wherepk>500)多语句批量更新(updat......
  • Mysql批量插入性能优化学习
    转自:https://www.cnblogs.com/myseries/p/11191134.html1.批量insert1.1一条sql将单条insert改为批量insert,其实个人认为改为replaceinto更好,批量insert时,如果其中一......
  • MySQL启动时自动创建数据库
    一、背景及分析MysqL容器启动时,会自动创建一些必要的数据库,比如MysqL,这是官方默认的做法。但是,在实际中,还需要让MysqL自动创建我们自定义的数据库。本文就此应用场合进行......
  • MySQL关联查询
    一、关联查询1、概念在查询数据时,所需要的数据不只在一张表中,可能在两张或多张表中。这个时候,需要同时操作这些表来查询数据,即关联查询。关联查询所涉及到的表与表之间都......
  • 通过docker部署grafana和mysql
    阅读本文需要一定的Linux,Docker与MySQL知识,例如:会启动容器,进入容器;会创建表,会使用INSERT语句,会使用SELECT语句...1.简介2.网络设置-2.1docker网络......
  • MySQL
    数据库当中最基本的单位是表:table姓名性别年龄(列:字段)张三男20—->行(记录)李四女21王五男22数据库当中是以表格的形式表示数据的因为表......
  • MySQL的SQL优化常用30种方法[转]
    MySQL的SQL优化常用30种方法1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2、应尽量避免在where子句中使用!=或<>操作符,......
  • 开发笔记1.1-配置可视化MySQL工具phpMyAdmin
    配置好phpMyAdmin前提是需要安装http服务器、php、phpMyAdmin1.安装http服务器#安装httpd服务器yuminstallhttpd#开启http服务器并设置开机启动sudosystemctlst......
  • MySQL 数据列长度超长处理策略 & STRICT_TRANS_TABLES
    对于一个数据库表column例如长度namevarchar(8)当用insert长度超过8的时候一般会报错,但有时候也会阶段报错。那具体跟什么有关系呢?其实就是sql_mode的配置有关,具体结论......
  • MYSQL性能优化的最佳20+条经验
    MYSQL性能优化的最佳20+条经验 2009年11月27日  陈皓 评论 169条评论  251,274人阅读今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其......