是的。高偏移量速度慢,效率低。
在偏移量處查找記錄的唯一方法是計算之前出現的所有記錄,然後丟棄它們。
(我不知道ROW_NUMBER(),但將是標準的SQL限制。所以
SELECT * FROM table LIMIT 1999,20
)
。在上述〔實施例中,前2000條記錄,必須先取出,然後丟棄。通常它不能跳過,或者使用索引直接跳到數據中的正確位置,因爲通常會有'WHERE'cluse過濾結果。
緩存結果是可能的,這可能是SO所做的。所以它不必每次都計算大的偏移量。 (SO的大部分搜索都是已知標記的「小」集合,因此緩存是非常可行的。一個arbitary搜索查詢會產生多大的版本趕上,不實用) (Alternativly它可能會使用一些其他的實現,它允許arbitary偏移)
其它地方採取有關類似的事情 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)
(Arbitary查詢choosen以免使用索引非常好,如果索引可以使用的差異不太明顯,更難以看到,但在生產系統上運行大量的查詢,1。或2ms差異e是巨大的)
更新:(對一個索引查詢)
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)
看看這個http://www.percona.com/ppc2009/PPC2009_mysql_pagination.pdf – 2011-12-31 12:22:24