2015-01-20 36 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子句将不会极大地伤害你的表现。

相关问题