我有一个超过10万行的数据集,所以它不是很小,但也不是很大。在对结果进行分页时,随着您转到较高页面,它会逐渐变慢。换句话说,这个查询:
SELECT * FROM items WHERE public = 1 ORDER BY name LIMIT 0,10
执行速度比
快得多SELECT * FROM items WHERE public = 1 ORDER BY name LIMIT 10000,10
我有名称的索引,我曾经在公开上有索引,但我删除了它,因为它似乎会降低性能甚至更多。
这里有什么想法吗?有没有一种简单的方法可以加快速度?我正在考虑删除查看较高页面的功能,因为除了机器人之外没有人真正浏览过去的第2页或第3页,并且有更简单的方法可以让他们找到该内容。
答案 0 :(得分:2)
大限制问题:
小心大限制使用索引进行排序是有效的,如果您需要前几行,即使进行了一些额外的过滤,因此您需要按LIMIT请求按索引扫描更多行。但是,如果您处理LIMIT查询具有较大的偏移效率将受到影响。 LIMIT 1000,10可能比LIMIT 0,10慢。确实,大多数用户在结果中不会超过10页,但搜索引擎机器人可能会这样做。我见过机器人在我的项目中看了200多页。此外,对于许多未能处理此问题的网站,提供了一个非常容易的任务来启动DOS攻击 - 从少数连接请求包含大量数字的页面就足够了。如果您不做任何其他事情,请确保阻止页码太大的请求。
对于某些情况,例如,如果结果是静态的,那么预先计算结果可能是有意义的,这样您就可以查询它们的位置。 因此,不是使用LIMIT 1000,10查询,而是在1000和1009之间的WHERE位置,对于任何位置都具有相同的效率(只要它被索引)
资源: