當數據量較大的時候,我們可能需要分批處理數據,首先想到的是使用limit加上偏移量的方法首先分頁操作,同時加上合適的ORDER BY字句。如果有對應的索引,通常效率會不錯,否則,mysql需要做大量的文件排序操作。
但是當偏移量非常大的時候,比如limit 10000, 20這樣的查詢,這時MySQL需要查詢10020條記錄後只返回最後20條,前面10000條記錄都將被拋棄,這樣的代價非常高。如果所有的頁面被訪問的頻率都相同,那麼這樣的查詢平均需要訪問半個表的數據。
優化此類分頁查詢的一個最簡單的方法就是儘可能的使用索引覆蓋掃描,而不是查詢所有的列。然後根據需要做一次關聯操作再返回所需的列。對於偏移量很大的時候,這樣做的效率會提升非常大。考慮下面的查詢:
select id from blog order by id limit 1000, 50
如果這個表非常大,那麼這個查詢最好改成下面的樣子:
select t1.id, t1.title
from blog t1
inner join(
select id from blog
order by id limit 1000, 50
) as lim using(id)