我刚在YouTube上尝试了以下问题:
http://www.youtube.com/results?search_query=test&search=tag&page=100
并收到错误消息:
很抱歉,YouTube不会为任何查询提供超过1000个结果。 (您要求从2000年开始的结果。)
我也试过谷歌搜索“测试”,虽然它说有大约34.4亿个结果,但我只能进入第82页(或大约820个结果)。
这让我想知道,N个记录之后的分页搜索(特别是在SQL Server中使用ROW_NUMBER()或其他数据库系统中的类似功能),性能是否开始降低,或者YouTube / Google出于其他原因这样做?当然,大多数人不太可能需要超过查询的前1000个结果,但我认为由于某些技术原因,这个限制是专门设置的。
然后Stack Overflow再次让您翻阅47k结果:https://stackoverflow.com/questions/tagged/c?page=955&sort=newest&pagesize=50
答案 0 :(得分:1)
是。高偏移是缓慢且低效的。
在偏移处查找记录的唯一方法是计算之前记录的所有记录,然后丢弃它们。
(我不知道ROW_NUMBER(),但在标准SQL中会是LIMIT。所以
SELECT * FROM table LIMIT 1999,20
)
..在上面的示例中,必须首先获取前2000条记录,然后丢弃。通常它不能向前跳,或者使用索引直接跳转到数据中的正确位置,因为通常会有一个'WHERE'子句过滤结果。
可以缓存结果,这可能与SO有关。因此,它实际上不必每次都计算大的偏移量。 (SO的大多数搜索都是一组'小'的已知标签,因此缓存是非常可行的。任意搜索查询都会有很多版本要捕获,这使得它不切实际) (或者它可能正在使用其他一些允许任意偏移的实现)
其他地方采取类似的事情 http://sphinxsearch.com/docs/current.html#conf-max-matches
envolope测试的背面:
mysql> select gridimage_id from gridimage_search where moderation_status = "geograph" order by imagetaken limit 100999,3;
...
3 rows in set (11.32 sec)
mysql> select gridimage_id from gridimage_search where moderation_status = "geograph" order by imagetaken limit 3;
...
3 rows in set (4.59 sec)
(选择任意查询以便不使用索引,如果可以使用索引,则差异不那么明显且难以看到。但是在运行大量查询的生产系统中,1或2ms差异很大)
更新:(显示索引查询)
mysql> select gridimage_id from gridimage_search order by imagetaken limit 10;
...
10 rows in set (0.00 sec)
mysql> select gridimage_id from gridimage_search order by imagetaken limit 100000,10;
...
10 rows in set (1.70 sec)
答案 1 :(得分:0)
这是一个TOP子句,旨在限制数据库必须执行的物理读取量,这限制了查询所花费的时间。想象一下,您有数百亿条链接到数据库中有关“日本”的故事。如果有人询问“日本”怎么办?是否真的会点击所有820亿个结果?不。用户需要前1000个最相关的结果。当搜索是通用的,如“测试”时,无法确定相关性。在这种情况下,YouTube / Google必须限制返回的卷,以便其他用户不受通用搜索的影响。什么更快,返回1,000个结果或82,000,000,000个结果?