2012-08-15 117 views
1

我有一個場景,我需要檢查10,000個不同的特定名稱,並對照大約60,000個記錄名稱的表格。假設緩存不相關,一般來說,出於性能目的,它是更好的:一個巨大的SQL語句或許多小型SQL語句?

(1)分解成迷你查詢,以便每個查詢可能有200個不同的名稱?

(2)收件10,000一個mongocious SQL語句 「OR」 的條款?

+6

你錯過了第3號:完全以另一種方式完成。我會將列表寫入單獨的表/臨時表或其他內容,然後使用連接進行過濾。 – 2012-08-15 22:48:11

+0

@JonEgerton發佈它作爲答案? – kapa 2012-08-15 22:54:27

+1

@bažmegakapa:現在有。 – 2012-08-15 22:57:29

回答

7

你錯過了3號:自己完全是另一種方式:

我會寫列表,以一個單獨的表/臨時表什麼的,然後用join/exists或任何過濾。

+1

+1 - 絕對是我的首選方式。考慮到大多數(所有)RDBMS具有「負載」實用程序,這也可能是最快的方式。 – 2012-08-15 22:59:00

+1

+1在臨時表中執行速度要快得多 – MMeah 2012-08-15 22:59:37

+0

可能唯一一次這樣做不好,但如果名稱在每個請求中完全更改,那麼這可能不會奏效。這意味着刪除表格,重新創建表格,插入記錄,然後每次創建'JOIN'。 – rid 2012-08-15 23:02:27

1

第一個觀察結果是,通常RDBMS對查詢字符串的大小有限制,您可能會用這麼多的OR來超出查詢字符串的大小。

所以一個解決方案是編寫一個存儲過程並在循環中完成。

忽略這一點,考慮到情況(1)數據訪問次數比情況(2)多,後者更可取。

1

或#4 - 批量使用IN()查詢。關於1000通常工作得很好:

SELECT * FROM表WHERE名稱( 'STR1', 'str2的', 'STR3',...)

它並不完美,但有沒有涉及臨時表, MySQL對於優化IN()很不錯。