MySQL中IN和NOT IN的大小限制是多少?

时间:2009-01-17 05:12:45

标签: mysql

当IN或NOT IN的条件非常大时,我的应用程序出现内存异常。我想知道这有什么限制。

6 个答案:

答案 0 :(得分:8)

也许你会用另一种方式来完成你的查询会更好吗?

我建议您将匹配值加载到单列表中,然后将要查询的列内部连接到新表中的单个列。

而不是

SELECT a, b, c FROM t1 WHERE d in (d1, d2, d3, d4, ...)

构建一个包含1列的临时表,称之为“dval”

dval  
----  
 d1  
 d2  
 d3
SELECT a, b, c FROM t1  
INNER JOIN temptbl ON t1.d = temptbl.dval

答案 1 :(得分:4)

在进行SQL查询或数据库设计时,不得不询问限制,这是一个很好的指示,表明你做错了。

答案 2 :(得分:3)

当条件非常小(大约100行左右)时,我只使用IN和NOT IN。它在这些情况下表现良好。当条件很大时我使用OUTER JOIN,因为查询不必为每个元组查找“IN”条件。您只需检查您希望所有行都来自的表。

对于“IN”,连接条件为IS NOT NULL

对于“NOT IN”,连接条件为IS NULL

e.g。

/* Get purchase orders that have never been rejected */
SELECT po.*
FROM PurchaseOrder po LEFT OUTER JOIN 
     (/* Get po's that have been rejected */
     SELECT po.PurchaesOrderID
     FROM PurchaseOrder po INNER JOIN 
         PurchaseOrderStatus pos ON po.PurchaseOrderID = pos.PurchaseOrderID
     WHERE pos.Status = 'REJECTED'
     ) por ON po.PurchaseOrderID = por.PurchaseOrderID
WHERE por.PurchaseOrderID IS NULL    /* We want NOT IN */

答案 3 :(得分:1)

我有一个类似的问题但只在我的IN子句中传递了100个3位数字。当我查看堆栈跟踪时,它实际上切断了IN子句中逗号分隔的值。我没有得到错误,我只是没有得到所有结果返回。有没有人之前有这样的问题?如果相关,我正在使用symfony框架......我正在检查它是否是一个推进问题,但只是想要看看它是否可以是sql

答案 4 :(得分:0)

我在IN中使用了相当大的ID列表 - 我怀疑内存问题不在查询本身中。你是如何检索结果的?

此查询例如来自实时网站:

SELECT DISTINCT c.id, c.name FROM categories c 
LEFT JOIN product_categories pc ON c.id = pc.category_id 
LEFT JOIN products p ON p.id = pc.product_id 
WHERE p.location_id IN (
955,891,901,877,736,918,900,836,846,914,771,773,833,
893,782,742,860,849,850,812,945,775,784,746,1036,863,
750,763,871,817,749,838,986,794,867,758,923,804,733,
949,808,837,741,747,954,939,865,857,787,820,783,760,
911,745,928,818,887,847,978,852
) ORDER BY c.name ASC  

我在代码中的第一次传递是非常幼稚的,并且在一个页面上有大约10个这样的查询,并且数据库不会闪烁。

当然,您可以运行一个包含100k值的列表,这些列表将完全不同。

答案 5 :(得分:0)

我不知道限制是什么,但我之前也遇到过这个问题。我不得不重写我的查询:

select * from foo
  where id in (select distinct foo_id from bar where ...)