您好我有一个7milion记录数据库表来测试查询速度。
我测试了我的2个查询,这些查询是具有不同限制参数的相同查询:
查询1 -
SELECT *
FROM table
LIMIT 20, 50;
查询2 -
SELECT *
FROM table
LIMIT 6000000, 6000030;
查询执行次数是:
在这两个查询中,我都获取相同数量的记录,但在第二种情况下,它需要更多时间。有人可以解释一下这背后的原因吗?
答案 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;