like <some query> and agt.item in (',productRange,.......<very large data, having around 2 lakh chars>)
有了这个查询失败说语法错误。但是在查询中执行的项目数量较少。 请让我知道如何处理这类问题。
答案 0 :(得分:3)
大多数DBMS对大型参数列表都很糟糕。 所以如果你有一个很大的“IN”列表,例如
SELECT *
FROM foo
WHERE bar IN ('1','2','3','4'...,'500000')
与包含您要选择的所有值的表格以及加入两个表格相比,您将获得非常差的性能:
CREATE TABLE baz (
bar VARCHAR
)
INSERT INTO baz(bar) VALUES ('1');
INSERT INTO baz(bar) VALUES ('2');
INSERT INTO baz(bar) VALUES ('3');
INSERT INTO baz(bar) VALUES ('4');
...
INSERT INTO baz(bar) VALUES ('500000');
SELECT *
FROM foo,
baz
WHERE foo.bar = baz.bar
因此,由于MySQL没有表值参数,最好的办法是将数据存储在临时表中,而不是在查询中输入,并且不要忘记你需要一个关于你要过滤的值的索引on(在你的情况下为agt.item)。
答案 1 :(得分:0)
如果IN
子句中的valuesitemsitems来自另一个先前的查询,那么您可能只使用子查询。
假设您当前的代码如下所示:
SELECT some_field FROM table1 WHERE condition1;
-- returns a long list and/or large strings
SELECT * FROM table2 WHERE condition2 AND item IN ( @records_from_previous_query );
您可以将其重写为:
SELECT *
FROM table2
JOIN table1 ON (table1.some_field = table2.item AND condition1)
WHERE condition2