這裏是我的問題...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數據庫交互。
我會說創建和插入一個表比動態創建查詢要慢很多,所以只要你的列表不是太長,就用長的'SELECT ... IN'語句。對於最大查詢長度檢查max_allowed_packet變量:http://dev.mysql.com/doc/refman/5.0/en/packet-too-large.html – Florent 2015-01-20 20:02:18
適當索引,JOIN可能會更快 – Strawberry 2015-01-20 20:06:53
@Strawberry會有確保同時連接不會重疊的很多開銷,以及磁盤I/O將結果提交到磁盤/在 – 2015-01-20 20:19:04