2014-07-12 119 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逐個檢查它們,並且索引不適合內存,那麼這可能會使性能受益。 –