0

我们有大约 90 万条记录的表。我们正在尝试执行具有大数据的查询(注意:查询很大)

like <some query> and agt.item in (',productRange,.......<very large data, having around 2 lakh chars>)

有了这个,查询失败,说语法错误。但它执行的查询项目数量较少。请让我知道如何处理此类问题。

4

2 回答 2

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 没有表值参数,因此您最好的选择是将数据存储在临时表中,而不是在查询中输入数据,并且不要忘记您需要对要过滤的值进行索引(agt .item 在你的情况下)。

于 2013-02-27T10:23:19.593 回答
0

如果您的子句中的 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
于 2013-02-27T14:47:00.777 回答