热烈奔跑。 A有数百万条记录,B,C,D ......较小(数千)
SELECT ... FROM A LEFT OUTER JOIN B ... LIMIT 1000 OFFSET 0;
返回< 0.1秒
SELECT ... FROM A LEFT OUTER JOIN B ... LIMIT 1000 OFFSET 1000000;
虽然这在>中返回4秒
假设顺序是A的PK,并且所有连接都被正确索引,我会假设2个操作应该具有相似的性能,但看起来它的O(N)根据偏移...
查询计划不应该首先从A中选择1000,然后再进行连接吗?我将A的选择与两个不同的偏移进行了比较,时间差远小于1秒,因此不应解释给定连接时间的巨大差异。
这是mysql查询计划优化器的缺陷吗?
答案 0 :(得分:1)
由于您未提及ORDER BY
子句,因此可以在第一个查询中的限制中指定的1,000条记录之后停止查询。第二个查询较慢,因为必须生成1,001,000条记录,然后只返回最后1,000条记录。
希望有所帮助。