前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简聊limit 0,100和limit 10000000,100一样吗

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

作者头像
@派大星
发布2024-06-08 08:53:46
740
发布2024-06-08 08:53:46
举报
文章被收录于专栏:码上遇见你码上遇见你

正如题目所问。

其实不一样的。这是 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时,每次查询结果都可能不同。例如,下面两次查询的结果可能会有所不同:

代码语言:javascript
复制
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 这样保证不会重复的字段。

代码语言:javascript
复制
mysql> SELECT * FROM ratings ORDER BY category,id LIMIT 5;

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • limit 优化
  • limit 和 order by
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档