2012-01-05 58 views
1

我有這樣如何優化mysql查詢包含「in」操作數?

select * from logs where uid in (id1, id2, ...) 

查詢,但我擔心的性能,如果有一個在中(列表很多IDS),好比說在2000 IDS,即使按照解釋的輸出,這種說法確實使用索引在uid列上。 我想知道是否有其他方式來查詢它與這種條件,或如何做一些優化這個SQL語句?

任何答案表示讚賞。

補充:表格格式是myisam,出於某種原因,我無法更改存儲引擎。

+0

你有問題嗎? – 2012-01-05 06:24:01

+1

如果()中的ids來自某個條件下的另一個表,則可以使用join。如果uid來自任意用戶輸入,我認爲你不能做太多的工作 – 2012-01-05 06:26:22

+0

@andreas是的,這些id來自另一個數據源。如果我將它們分爲「uid = id1或uid = id2或....」,它會有幫助嗎? – hago 2012-01-05 06:32:25

回答

2

2000個項目?!?哇!

建議: 寫您的2000個項目表,並做一個內部聯接,而不是「其中UID(......)」

+0

它有很大的不同嗎? – 2012-01-05 06:37:11

+1

那是什麼目的? – newtover 2012-01-05 06:55:46

+0

這些用戶對於每個請求會有所不同,會插入臨時表中的成本是多少? – hago 2012-01-11 07:50:44

0

我已經在上面的評論中提到一個鏈接到類似的問題。

此外,這種類型的查詢應該在MySQL中用於加速某些類型的JOINS。查詢的結果可以很容易地被查詢緩存緩存,從而加速您網站上的重複連接(即,當您將連接拆分爲幾個較小的查詢時,其中一個查詢的緩存結果不斷失效,但是其他則相當穩定)。 IN運算符對操作數進行排序以減少隨機索引讀取。

您應該真正關心的唯一事情是將整數作爲整數而不是字符串傳遞,以便操作數能夠正確排序。