✅简聊limit 0,100和limit 10000000,100一样吗?

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: MySQL的`LIMIT m n`在处理深度分页时性能下降,因为它先读取m+n条数据再抛弃m条。`LIMIT 10000000,100`比`LIMIT 0,100`性能差,因为它涉及大量无用数据读取。优化包括:MySQL可能为少量记录查询使用索引,`ORDER BY`结合`LIMIT`可提前停止排序,`DISTINCT`与`LIMIT`结合时找到唯一行即停止,`LIMIT 0`快速返回空结果集。注意,无索引的`ORDER BY`加`LIMIT`可能导致不确定结果,解决方案是添加确保唯一性的排序字段。

正如题目所问。

其实不一样的。这是 MySQL 中典型的深度分页问题。

MySQL 的LIMIT m n工作原理是先读取前 m+n 条记录,再抛弃前 m 条,然后返回后面的 n 条数据。因此,当 m 值增大时,偏移量也增大,性能表现就会变差。

因此,LIMIT 10000000,100要比LIMIT 0,100的性能差得多,因为它需要先读取 10000100 条数据,然后再抛弃前 10000000 条。

limit 优化

通常,在查询数据时,如果已经明确知道所需行数,建议在查询语句中使用LIMIT,而不是先检索整个结果集再丢弃不需要的数据。

尽管我们前面提到,在深度分页时,MySQL 也会先检索全部数据再丢弃,但 MySQL 对LIMIT也进行了一些优化。然而,以下优化前提假设在使用LIMIT时没有使用HAVING语句。

  1. MySQL 通常更倾向于执行全表扫描,但如果您使用LIMIT只查询少量记录,MySQL 在某些情况下可能会选择使用索引。
  2. 如果将LIMIT子句与ORDER BY子句结合使用,MySQL 会在找到排序结果的前 row_count 行数据后立即停止排序,而不是对整个结果进行排序。如果使用索引完成排序,这将非常快。

当使用索引来执行 ORDER BY 子句时,MySQL 能够利用已经排好序的索引树,从而快速找到所需的前 N 行数据,而无需对整个表进行全表扫描和排序。

  1. 当将LIMIT row_countDISTINCT一起使用时,一旦找到 row_count 个唯一的行,MySQL 就会停止。
  2. 使用LIMIT 0可以快速返回一个空的结果集,这是一种很有用的方法,用于检测查询是否有效。
  3. 如果ORDER BY不适用索引,并且后面还有LIMIT子句,优化器可能会避免使用合并文件,而是使用内存中的filesort操作对内存中的行进行排序。

limit 和 order by

我们都知道,在查询过程中,如果对某个字段进行排序(ORDER BY),而该字段存在重复值,MySQL 可能以任意顺序返回这些行记录,并且根据执行计划的不同,排序结果可能会有所不同。换句话说,排序结果可能是不确定的。

因此,当ORDER BY语句中有LIMIT时,每次查询结果都可能不同。例如,下面两次查询的结果可能会有所不同:

mysql> SELECT * FROM ratings ORDER BY category;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
|  1 |        1 |    4.5 |
|  5 |        1 |    3.2 |
|  3 |        2 |    3.7 |
|  4 |        2 |    3.5 |
|  6 |        2 |    3.5 |
|  2 |        3 |    5.0 |
|  7 |        3 |    2.7 |
+----+----------+--------+

那么,解决这个问题的一个好方法就是在排序时不仅使用一个字段,而是再加一个字段,比如像 id 这样保证不会重复的字段。

mysql> SELECT * FROM ratings ORDER BY category,id LIMIT 5;

如有问题,欢迎微信搜索【码上遇见你】。

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
移动开发 Serverless 异构计算
函数计算操作报错合集之Reserve resource exceeded limit 通常出现在什么情况下
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
1月前
|
关系型数据库 MySQL 索引
✅count(1)、count(*) 与 count(列名) 的区别
COUNT(1)、COUNT(\*)和COUNT(列名)在MySQL中用于统计行数。COUNT(\*)是SQL标准,MySQL对其优化,尤其在无WHERE条件下,MyISAM存储引擎能直接返回总行数。COUNT(1)与COUNT(\*)性能相近,但在某些情况下,MySQL可能对COUNT(\*)有特别优化。COUNT(列名)只计算非NULL值,性能较慢。推荐使用COUNT(\*),它是标准语法且优化良好。InnoDB处理COUNT(\*)和COUNT(1)无性能差异。COUNT(字段)需检查NULL,性能相对较慢。
✅count(1)、count(*) 与 count(列名) 的区别
|
17天前
|
监控 Serverless 文件存储
函数计算操作报错合集之显示的错误信息 "Reserve resource exceeded limit",一般是什么导致的
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
2月前
|
机器学习/深度学习 存储 SQL
别再用offset和limit分页了
别再用offset和limit分页了
16 0
|
存储 缓存 大数据
Starrocks执行查询报错:Memory of process exceed limit. Used: XXX, Limit: XXX. Mem usage has exceed the limit of BE
Starrocks执行查询报错:Memory of process exceed limit. Used: XXX, Limit: XXX. Mem usage has exceed the limit of BE
|
SQL 关系型数据库 MySQL
postgre分页查询报错:ERROR: LIMIT #,# syntax is not supported 建议:Use separate LIMIT and OFFSET clauses
postgre分页查询报错:ERROR: LIMIT #,# syntax is not supported 建议:Use separate LIMIT and OFFSET clauses
275 0
postgre分页查询报错:ERROR: LIMIT #,# syntax is not supported 建议:Use separate LIMIT and OFFSET clauses
|
SQL Java 程序员
记录:1221 - Incorrect usage of UNION and ORDER BY...【亲测有效】
记录:1221 - Incorrect usage of UNION and ORDER BY...【亲测有效】
385 0
|
数据库
分页limit和排序order by
分页limit和排序order by
|
SQL 关系型数据库 MySQL
select、distinct、limit使用
select、distinct、limit使用
242 0
select、distinct、limit使用