MySQL 查询 limit 1000,10 和 limit 10 速度一样快吗? 深度分页如何破解

本文探讨了MySQL中limit查询性能问题,特别是offset值大的情况下,limit 1000,10的查询速度明显慢于limit 10。通过分析limit的执行过程,指出深度分页会导致效率降低,甚至可能触发全表扫描。提出了优化方案,如使用子查询减少无用数据的获取,但指出深度分页问题本质上无解,应从需求和产品设计层面避免此类问题的发生。" 83550453,7717301,Python基础教程:循环详解,"['Python基础', '循环结构', '编程语法']
摘要由CSDN通过智能技术生成

刷网站的时候,我们经常会遇到需要分页查询的场景。

比如下图红框里的翻页功能。

我们很容易能联想到可以用mysql实现。

假设我们的建表sql是这样的

mysql建表sql

建表sql大家也不用扣细节,只需要知道id是主键,并且在user_name建了个非主键索引就够了,其他都不重要。

为了实现分页。

很容易联想到下面这样的sql语句。

select * from page order by id limit offset, size;

比如一页有10条数据。

user表数据库原始状态

第一页就是下面这样的sql语句。

select * from page order by id limit 0, 10;

第一百页就是

select * from page order by id limit 990, 10;

那么问题来了。

用这种方式,同样都是拿10条数据,查第一页和第一百页的查询速度是一样的吗?为什么?

两种limit的执行过程

上面的两种查询方式。对应 limit offset, size 和 limit size  两种方式。

而其实 limit size ,相当于  limit 0, size。也就是从0开始取size条数据。

也就是说,两种方式的区别在于offset是否为0。

我们先来看下limit sql的内部执行逻辑。

Mysql架构

mysql内部分为server层存储引擎层。一般情况下存储引擎都用innodb。

server层有很多模块,其中需要关注的是执行器是用于跟存储引擎打交道的组件。

执行器可以通过调用存储引擎提供的接口,将一行行数据取出,当这些数据完全符合要求(比如满足其他where条件),则会放到结果集中,最后返回给调用mysql的客户端(go、java写的应用程序)

我们可以对下面的sql先执行下 explain

explain select * from page order by id limit 0, 10;

可以看到,explain中提示 key 那里,执行的是PRIMARY,也就是走的主键索引

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL 分页查询的语法如下: ``` SELECT * FROM table_name LIMIT 10, 10; ``` 其中,10 表示从第 11 行开始,10 表示查询 10 行数据,即查询结果为第 11 行到第 20 行的数据。在LIMIT语句中,第一个数字表示查询的起始位置(从0开始),第二个数字表示查询的条目数。 ### 回答2: MySQL分页查询是一种常见的数据库查询操作,它可以在数据表中按页数将数据项进行分块,从而速定位数据项的位置。其中,limit关键字是控制数据分页的核心实现之一。 当我们需要查询数据表中某一范围内的数据时,可以使用limit关键字来限制查询的数据量,从而实现分页查询。 例如,查询表中第10到20条数据,可以使用如下SQL语句: SELECT * FROM table_name LIMIT 10,10; 其中,LIMIT 10,10表示从第11条数据开始查询查询10条数据。 当我们需要查询更大范围的数据时,可以根据具体情况调整第二个参数的数值。同时,我们也可以通过增加WHERE或ORDER BY等关键字来实现更加精确的数据查询操作。 ### 回答3: MySQL分页查询通常用于在大量数据中获取一部分数据,以便在页面上展示给用户,以提高数据查询的效率。在MySQL中,可以通过使用LIMIT关键字来进行分页。例如,要查询10到20行之间的记录,可以使用如下查询语句: SELECT * FROM table_name LIMIT 10,10; 其中,10表示从第11行开始查询10表示查询10行。即返回查询结果的第11行到第20行之间的记录。 需要注意的是,LIMIT语句中的第一个参数必须为非负整数,表示查询结果集开始的偏移量,而第二个参数也必须为非负整数,表示最多返回的记录数。如果第一个参数为0,则表示从第一条记录开始查询。 在进行分页查询时,为了避免查询结果不稳定的情况,可以在查询语句中加入ORDER BY子句对查询结果进行排序,例如: SELECT * FROM table_name ORDER BY id LIMIT 10,10; 其中,id为表格的主键,可根据实际情况进行变更。 需要注意的是,在进行分页查询时,应尽可能避免使用OFFSET关键字,因为OFFSET会使MySQL从偏移量之前的数据全部扫描一遍,效率较低。因此,除非必要,应尽可能避免使用OFFSET。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值