QUERY速度限制和百万条记录

时间:2011-08-18 03:02:25

标签: php mysql sql

您好我有一个7milion记录数据库表来测试查询速度。

我测试了我的2个查询,这些查询是具有不同限制参数的相同查询:

查询1 -

SELECT    * 
FROM      table 
LIMIT     20, 50;

查询2 -

SELECT    * 
FROM      table 
LIMIT     6000000, 6000030;

查询执行次数是:

  1. 查询1 - 0.006秒
  2. 查询2 - 5.500秒
  3. 在这两个查询中,我都获取相同数量的记录,但在第二种情况下,它需要更多时间。有人可以解释一下这背后的原因吗?

3 个答案:

答案 0 :(得分:8)

如果不仔细研究,我的假设是发生这种情况是因为第一个查询只需要读取第50个记录以返回结果,而第二个查询必须在返回结果之前读取600万个。基本上,第一个查询只是更快地短路。

我认为这与表格的构成有很大关系 - 字段类型和键等。

如果记录由固定长度的字段组成(例如CHAR与VARCHAR),则DBMS可以只计算第n条记录的起始位置并跳转到那里。如果它的长度可变,则必须读取记录以确定第n条记录的起始位置。同样,我进一步假设具有适当主键的表比没有这些键的表更快查询。

答案 1 :(得分:6)

我认为减速与您使用带偏移限制的事实有关,并且查询表没有额外的索引上下文。它可能第一个更快,因为它可以更快地达到偏移。

答案 2 :(得分:4)

这是返回50行和6000030行之间的区别(或者因为你说只有7百万行所以行大约100万行)。

  

使用两个参数,第一个参数指定的偏移量   第一行返回,,第二行指定最大数量   要返回的行。初始行的偏移量为0(不是1):

     

SELECT * FROM tbl LIMIT 5,10; #检索行6-15

http://dev.mysql.com/doc/refman/5.0/en/select.html

此外,我认为您正在寻找30个行页面,因此您的查询应该使用30作为限制子句中的第二个参数。

SELECT    * 
FROM      table 
LIMIT     20, 30;

SELECT    * 
FROM      table 
LIMIT     6000000, 30;