我有一个拥有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
100100"
效率非常低,上次查询时间会增加很多:
-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秒
最好在我INSERT Record时保持数据库的顺序?
我该怎么办?
上面提到的StackOverflow页面如何快速加载?
谢谢!。
答案 0 :(得分:0)
-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')
- 上一页最后一行的字段值(记录,名称)。
答案 1 :(得分:0)
另一个解决方案 - 使用子序列:
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 performance: late row lookups