2015-01-20 93 views
0

這裏是我的問題...MySQL - 如何檢查任意列表(〜1,000項)中的哪些項目在表中?

我需要能夠檢查其約1,000個項目(該)是含有約〜50萬行數據相當大表(草堆列表中的項目)。

我的問題是,最好/最快/最有效的方法是什麼?

我知道我可以創建一個SQL語句是這樣的:(假設ID1, ID2, ID3, ..., IDn是針)

SELECT id FROM haystack WHERE id IN (ID1, ID2, ID3, ..., IDn) 

但是,我不知道那是多麼高性能還是明智的,如果針列表包含1,000多個項目。

我也知道,如果我的針列表在它自己的表中,我可以將join那張表放到乾草堆表中。然而,針列表不是已經在一個表中。

所以 - 我想另一個可能的選擇是將這1000個項目放到一個臨時表中,然後將它加入乾草堆表。如果這是最好的選擇 - 那麼將1,000個物品快速加載到臨時表中的最佳方法是什麼? (?例如,1000條個人INSERT語句插入的所有行單一INSERT statment是否有一個INSERT語句可以長有限制?)

第三個可能的選項 - 寫列表到一個文本文件,然後使用LOAD DATA INFILE將其加載到(臨時)表中,然後將臨時表加入到乾草堆表中。但是,哇,這似乎是一個很大的開銷。

是否還有其他更好的選擇?

對於它的價值,這樣的背景下是PHP,而我從JSON Web服務響應得到列表,並使用庫MySQLi數據庫交互。

+3

我會說創建和插入一個表比動態創建查詢要慢很多,所以只要你的列表不是太長,就用長的'SELECT ... IN'語句。對於最大查詢長度檢查max_allowed_pa​​cket變量:http://dev.mysql.com/doc/refman/5.0/en/packet-too-large.html – Florent 2015-01-20 20:02:18

+0

適當索引,JOIN可能會更快 – Strawberry 2015-01-20 20:06:53

+0

@Strawberry會有確保同時連接不會重疊的很多開銷,以及磁盤I/O將結果提交到磁盤/在 – 2015-01-20 20:19:04

回答

1

根據this benchmark,使用臨時表和JOIN方法會更快。

我不確定這不是一個過早的優化。您應該執行自己的基準測試,並確定增加的複雜性是否值得您付出努力。我建議使用簡單的IN方法,只有在檢測到性能問題時纔開始優化。

只要記住,根據manual

值IN列表中的數只由max_allowed_packet值限制。

+0

@avudenie之後刪除它們 - 感謝您的響應和鏈接。我預計連接速度會比'SELECT ... IN'更快,但我仍然需要先將1000根針頭放入臨時表格中。所以聽起來像'SELECT'可能總體上更好。 – mattstuehler 2015-01-20 20:29:01

+0

@mattstuehler:'INSERT'出現在基準測試的每次迭代中,注意'TRUNCATE TABLE t_param;'和下面的'INSERT INTO t_param(param)VALUES'。即便如此,我預計你的情況差異幾乎無關緊要。 – avidenie 2015-01-20 20:37:11

+0

@avudenie - 感謝您的糾正。真的很棒,也是一個很好的答案。非常感激。 – mattstuehler 2015-01-20 20:57:38

1

我認爲你的查詢SELECT id FROM haystack WHERE id IN (ID1, ID2, ID3, ..., IDn)會沒事的。我有一個非常相似的用例,其中有數百萬個「針」,我通過PDO將它們傳遞給IN子句中的10,000個塊,沒有問題。

我會補充說你正在檢查的列應該被索引。在我的情況下,它是表格的主鍵。

1

如果針將用於頻繁地查詢haystack,您絕對需要創建一個新表。在這個例子中,我將假設針是int的值,並將它們標記爲id在表needle中。

首先,你需要創建表

CREATE TABLE needle (
    id INT(11) PRIMARY KEY 
) 

接下來,你需要插入值

INSERT INTO needle (id) 
VALUES (ID1), 
    (ID2), 
    ..., 
    (IDn) 

現在,您可以使用連接查詢haystack

SELECT h.id 
FROM haystack h 
JOIN needle n 
ON h.id = n.id 

如果這是一種罕見的查詢和針頭的數量不會增長超過1000,使用IN子句將不會極大地傷害你的表現。

相關問題