我们有大约 90 万条记录的表。我们正在尝试执行具有大数据的查询(注意:查询很大)
like <some query> and agt.item in (',productRange,.......<very large data, having around 2 lakh chars>)
有了这个,查询失败,说语法错误。但它执行的查询项目数量较少。请让我知道如何处理此类问题。
大多数 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 没有表值参数,因此您最好的选择是将数据存储在临时表中,而不是在查询中输入数据,并且不要忘记您需要对要过滤的值进行索引(agt .item 在你的情况下)。
如果您的子句中的 valuesitemsitemsIN
来自另一个先前的查询,那么您可能只使用子查询。
假设您当前的代码如下所示:
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