这里是我的问题...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