[英]show efficiently database milion record
我有一個擁有1000萬條記錄的數據庫。 該表的結構如下:
表名:記錄
例:
Name | Record
Darrin | 256
Aaron | 3
Daryl | 12
...
我想創建一個html頁面,按照以下記錄顯示排名順序:
- http://stackexchange.com/leagues/1/week/stackoverflow/2016-10-30?sort=reputationchange&page=1
,但我有兩個問題:
記錄太多 (ORDER BY需要20秒到沒有LIMIT的訂單表)
如果我一次向你展示一點 (例如第一頁0-100,第二頁100-200 ......), 每個頁面都應該調用一個查詢來對數據庫進行排序,如:
第一頁:“SELECT Name,Record FROM record ORDER BY Record DESC LIMIT 0,100”第二頁:“SELECT Name,Record FROM record ORDER BY Record DESC LIMIT 100,100”
這是非常低效的,並且上次查詢的時間會增加很多:
-first page:“SELECT Name,Record FROM record ORDER BY Record DESC LIMIT 0,100” - >需要0.003秒
-last page:“SELECT Name,Record FROM record ORDER BY Record DESC LIMIT 10.000.000,100” - >需要10秒
我插入記錄時最好保持數據庫的順序?
我該怎么辦?
上面提到的StackOverflow頁面如何快速加載?
謝謝!。
-first page:“SELECT Name,Record FROM record ORDER BY Record DESC LIMIT 0,100” - >需要0.003秒
-last page:“SELECT Name,Record FROM record ORDER BY Record DESC LIMIT 10.000.000,100” - >需要10秒
這是因為MySql接觸了第二次請求的10.000.100條記錄。
您需要通過復雜索引(Record,Name)替換索引(Record)並使用此SQL而不是您的SQL
SELECT Name,Record FROM record WHERE (Record, Name) < (3, 'Aaron') ORDER BY Record DESC, Name DESC LIMIT 100
對於第一頁和
SELECT Name,Record FROM record WHERE (Record, Name) < (3, 'Aaron') ORDER BY Record DESC, Name DESC LIMIT 100
,
對於下一頁,其中(3, 'Aaron')
- 上一頁最后一行的字段(記錄,名稱)的值。
另一個解決方案 - 使用子序列:
SELECT r.Name, r.Record FROM record r JOIN (
SELECT Record FROM record ORDER BY Record DESC LIMIT 10000000,100
) q ON q.Record = r.Record
請參閱此文章 - MySQL ORDER BY / LIMIT性能:后期行查找
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.