2014-07-12 120 views
1

我需要在MySQL上执行一个大的SELECT WHERE IN查询,我需要它快速运行。我有一个超过1亿行的表,主键在varchar 127上(并且必须这样)。优化大型MySQL SELECT WHERE IN语句

我正在执行SELECT col1 FROM table WHERE col1 IN($ in)其中$ in有5000个值。我基本上只需要找到主键col1中的表中的5,000个值中的哪一个。

查询通常需要1到10秒,但通常约为7或8秒。

是否有一个更优化,快速的方式来执行选择大型IN子句大型表索引varchar?

我正在使用InnoDB与PHP和PDO的专用服务器。感谢您的建议。

+1

您是否曾尝试将'$ IN'变量中的值放入临时表中,其中主键是值?加入此表可能有助于提高性能。另外,还有多少行被返回?如果结果集相当大,那么可能会花费时间检索数据,而不是生成结果集。 –

+0

这些值是否是任意的?也就是说,可能在WHERE开始处添加值,并且在IN子句中添加一些最大值 – Mihai

+0

Gordon,我还没有尝试过,并且需要为我拼写的步骤,因为我相对较新大型的mysql表。 5000人中有1000人到5000人之间的人通常会返回,这是相当大的回报。 – Guy

回答

0

这是有点长的评论。

我猜你已经有table(col1)的索引,否则查询可能需要超过10秒。如果不是这样,请添加一列。更好的是,使列成为主键。

我怀疑索引不适合内存。为此,你需要找到一个MySQL DBA(如果你有这么大的表,你应该知道)或者了解MySQL的内存选项。不适合内存的索引会表现出这种行为。

如果这是真的,那么行为应该是非常线性的。所以,如果你有一个500个ID的列表,它应该需要大约一秒或少一点。如果你有50个ID,那么十分之一秒左右。

在这种情况下排序ID列表可能会有所帮助。但是,这只是我的猜测。

+0

是的,我应该提到它是桌子上的主键。我想这可能是索引不适合内存,有没有办法检查是否是这种情况?任何指向哪里可以了解有关mysql的内存选项?最后,表中的ID按字母顺序排序,但IN子句不是 - 您建议的是? – Guy

+0

@Guy。 。 。如果'col1'是主键,则尝试对'in'语句中的id进行排序。如果MySQL逐个检查它们,并且索引不适合内存,那么这可能会使性能受益。 –