高效显示数据库版本记录

时间:2016-11-02 11:45:06

标签: php mysql sql database performance

我有一个拥有1000万条记录的数据库。该表的结构如下:

表名:记录

  • Filed1:Name(varchar)(主键)
  • Field2:记录(int / bigint)(索引)

示例:

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页面如何快速加载?

谢谢!。

2 个答案:

答案 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