2011-08-18 61 views
6

嗨,我有一个7milion记录数据库表,用于测试查询速度。QUERY极限和千万记录速度

我测试了我的2个查询这与不同的限制参数应用相同的查询:

查询1 -

SELECT * 
FROM  table 
LIMIT  20, 50; 

查询2 -

SELECT * 
FROM  table 
LIMIT  6000000, 6000030; 

查询EXEC时间:

  1. 查询1 - 0.006秒
  2. 查询2 - 5.500秒

在这两个查询的,我取相同数量的记录,而在第二种情况下它采取更多的时间。有人可以解释这背后的原因吗?

+0

你有任何索引吗?你有主键吗?如果你没有,那么这对我来说很有意义。 –

+0

@amir如果没有两个查询的索引应该是相同的测试不是?或者如果我把索引第二个查询将采取同一时间的第一个查询? – sbaaaang

+0

如果你根本没有索引,那么我不认为MySQL可以跳过第一个6000000行。您必须至少有一些主索引才能跳过行。也许别人可以证实这一点?我们也可以测试这个。 –

回答

8

如果不仔细观察它,我的假设是,这是因为第一个查询只需要读取第50条记录以返回结果,而第二个查询在返回结果之前必须读取六百万条记录。基本上,第一个查询只是更快地缩短。

我会假设,这有一个令人难以置信的大量做表的妆容 - 字段类型和钥匙等

如果一个记录是由固定长度字段(如CHAR与VARCHAR ),那么DBMS可以计算第n条记录的起始位置并跳转到那里。如果它的可变长度,那么你将不得不读取记录以确定第n条记录开始的位置。同样,我还会假设具有适当主键的表比没有这些键的表的查询更快。

+0

这就是我想肯定:(我认为没有解决方案的权利?只是查询缓存:( – sbaaaang

+1

@用户我想不出一种解决方案,我能想到的唯一的事情就是添加一个日期时间字段来标记创建的记录,然后在该字段中添加一个索引,然后在查询中对该字段进行排序,但我没有测试过,但是您可能会欺骗数据库以限制该密钥,这可能会使查询运行在O(1)的时间,但我不会指望它,而且,它不是你上面的查询,因为默认的排序顺序是由spec定义的 - 你将模拟一个通用约定而不是spec; YMMV。 – AgentConundrum

+0

感谢您的黑客我会尝试无论如何尝试我只是问差异更好地理解mysql如何处理数据库记录;) – sbaaaang

6

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

+1

一些谷歌搜索表明,MySQL计数每一行,直到它到达偏移量..所以猜测它只需要更长的时间才能达到xxxxx的攻击相比,第20行。 –

+0

这是真正的索引有没有,但不是一个速度问题,我只是问有关的差异;) – sbaaaang

4

这是返回50行和6000030行之间的区别(或者说你的表示只有700万行,大约有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; 
+0

第二个参数可能是一个促成因素,因为查询实际上会返回更多的行..我不认为它公平地说这不能提供答案..他的回答是返回bajillion行需要更长的时间..它可能是部分正确的。 –

+0

好的...所以那个范围内的记录也被解析或跳过?我认为他们被解析要么没有差异,而存在差异,对吧?与行数相比, – sbaaaang

+0

偏移量很小。 \t 我在挖掘参考文献 – dotjoe