【问题标题】:Alphabetical pagination gets progressively slower as you page (MySQL)当您分页时,按字母顺序分页会逐渐变慢(MySQL)
【发布时间】:2023-04-10 18:16:02
【问题描述】:

我有一个超过 100k 行的数据集,所以它不是很小,但也不是很大。在对结果进行分页时,当您转到更高的页面时,它会逐渐变慢。换句话说,这个查询:

SELECT * FROM items WHERE public = 1 ORDER BY name LIMIT 0,10

执行速度比

快得多
SELECT * FROM items WHERE public = 1 ORDER BY name LIMIT 10000,10

我在 name 上有一个索引,我曾经在 public 上有一个索引,但我删除了它,因为它似乎更降低了性能。

这里有什么想法吗?有没有一种简单的方法可以加快速度?我正在考虑取消查看更高页面的功能,因为除了机器人之外,没有人真正浏览过第 2 页或第 3 页,而且他们有更简单的方法可以找到该内容。

【问题讨论】:

  • 实际上它只有通过浏览所有数千个页面来产生巨大负载的机器人。
  • 按 varchar 排序没有帮助...

标签: mysql pagination


【解决方案1】:

大的 LIMIT 问题:

当心大的 LIMIT 如果您需要前几行,则使用索引进行排序是有效的,即使发生了一些额外的过滤,因此您需要按索引扫描更多行,然后由 LIMIT 请求。但是,如果您正在处理具有大偏移效率的 LIMIT 查询,则会受到影响。 LIMIT 1000,10 可能比 LIMIT 0,10 慢。确实,大多数用户的搜索结果不会超过 10 页,但搜索引擎机器人可能会这样做。我已经看到机器人在我的项目中查看 200 多页。此外,对于许多未能解决此问题的网站来说,这为发起 DOS 攻击提供了非常简单的任务——从少数连接中请求具有大量数量的页面,这就足够了。如果您不执行任何其他操作,请确保阻止页码过大的请求。

在某些情况下,例如,如果结果是静态的,那么预先计算结果可能是有意义的,这样您就可以查询它们的位置。 因此,不是使用 LIMIT 1000,10 进行查询,而是在 1000 和 1009 之间的 WHERE 位置,这对于任何位置都具有相同的效率(只要它被索引)


资源:

【讨论】:

  • 优秀的答案。非常感谢。
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2015-02-07
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多