栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有限制和大偏移量的MySQL查询永远存在

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有限制和大偏移量的MySQL查询永远存在

在大多数数据库中,带有偏移量的LIMIT极其慢(我已经找到了一些
有关MySQL的文档,并且我试图找到我之前读过的关于SQLite的一篇很好的文章)。原因是通常已实现了以下内容:

  1. 进行所有常规查询计划,就好像该
    LIMIT
    子句不在那儿一样
  2. 浏览结果,直到找到所需的索引
  3. 开始返回结果

如果您这样做

LIMIT 10000, 10
,这意味着什么,它将被解释为:

  1. 提取前10,000个结果并忽略它们
  2. 给你接下来的10个结果

有一个微不足道的优化方法,因为您不关心它们的值,所以您至少可以对前10,000个结果使用索引,但是即使在那种情况下,数据库仍然需要遍历10,000个索引值才能给您10个结果。可能还有进一步的优化可以改善这一点,但是通常情况下,
您不想

LIMIT
对大值使用偏移量

我知道,处理分页的最有效方法是跟踪最后一个索引,因此,如果第一个页面以结尾

id = 5
,则使您的 下一个 链接具有
WHERe id >5
LIMIT x
当然带有)。

编辑:找到了SQLite的文章。我强烈建议您阅读此书,因为它解释了在SQL中执行操作的正确方法。由于SQLite的人
真的很聪明, 而其他数据库也有同样的问题,因此我认为MySQL以类似的方式实现了这一点。

经常出现的另一个错误是程序员尝试使用LIMIT和OFFSET实现滚动窗口。这里的想法是,您首先只需要记住显示中顶部条目的索引,然后运行如下查询:

SELECt title FROM tracksWHERe singer='Madonna'ORDER BY titleLIMIT 5 OFFSET :index

索引初始化为0。要向下滚动,只需将索引增加5并重新运行查询即可。要向上滚动,请将索引递减5并重新运行。

以上将实际工作。 问题是当索引变大时它变慢。
OFFSET在SQLite中的工作方式是使sqlite3_step()函数忽略它看到的第一个:index断点。因此,例如,如果:index为1000,则您实际上是在读1005个条目,而忽略除最后5个之外的所有条目。最终的结果是,随着列表中的位置越来越低,滚动开始变得缓慢。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381461.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号