Mysql IN子句与自动增量ID的范围

时间:2015-03-11 04:48:20

标签: mysql sql performance

我有一个MYSQL表,行数约为5000万(预计会增长)。现在我需要迭代整个表。我试图以块的形式进行迭代,即获取N行,处理,获取另外N行

该表具有自动递增整数ID作为主键。这样可以更容易迭代。我的问题是:哪个语句会更快(哪里是一种循环计数器):

SELECT * FROM table WHERE ID IN (i, i+1, ..., i+N)

OR

SELECT * FROM table WHERE ID >= i AND ID < i + N

第一个使用IN子句,它对主键进行查找,我认为这个子句非常快。第二个具有小于+大于条件的条件,对于非索引列将非常慢。但由于我在主键上执行此操作,因此我不确定其性能。

其中哪一项可以提供更好的效果,让我们说N = 1000

1 个答案:

答案 0 :(得分:2)

使用这个:

SELECT * FROM table WHERE ID >= $i AND ID < $i + $N

&#34;范围扫描&#34;很高兴找到第一行($ i),然后得到Next,Next,......这非常有效。

但是,这确实假设ID很密集。如果删除了很多行,则每次可能无法使用$ N行。 (是的,你可以说这并不重要。)

$ N = 1000 - 这是一个合理的数字 - 你没有花太多时间&#34;你不是&#34;阻止&#34;行太多了。等

对于其他技术(例如,当它不密集时),请参阅my blog on deleting in chunks