具有join和Union All语句的Mysql查询内存不足和超时
我有两个表项目和项目的卖家,每个项目可以在多个卖家 这里我从另一种方法得到ItemId,sellerId的映射,现在我需要所有这些项的详细信息。我至少获得5000个键(sellerId)值(itemId)对,通过使用此映射,我需要从这两个表中获取详细信息 为了在这里获得结果,我使用了以下查询:具有join和Union All语句的Mysql查询内存不足和超时,mysql,mysql-error-1064,Mysql,Mysql Error 1064,我有两个表项目和项目的卖家,每个项目可以在多个卖家 这里我从另一种方法得到ItemId,sellerId的映射,现在我需要所有这些项的详细信息。我至少获得5000个键(sellerId)值(itemId)对,通过使用此映射,我需要从这两个表中获取详细信息 为了在这里获得结果,我使用了以下查询: SELECT table1.column1, table1.column2, table1.column3, table2.column1, table2
SELECT
table1.column1,
table1.column2,
table1.column3,
table2.column1,
table2.column2
FROM
item as table1
INNER JOIN (
select
key1 as ITEMID,
value1 as SELLERID
UNION ALL
select
key2,
value2
UNION ALL
select
key3 ,
value3
UNION ALL
select
key4 ,
value4
UNION ALL
// ....5000 key value
pairs
) as KEY_VALUE
ON table1.item_id = KEY_VALUE.ITEMID
INNER JOIN
item_sellers as table2
ON table1.item_id = table2.item_id
AND table2.seller_id = KEY_VALUE.SELLERID
WHERE table1.active = 1
对于3000-4000个UNION ALL语句,此查询可以正常运行,但对于5000+键值对,即5000+UNION ALL语句,会出现错误,即内存不足异常/查询超时异常
这个查询有什么问题吗?如果是的话,请把灯打开好吗
有没有办法优化这个查询
PS:当我把所有5000个键值对放在这个查询中时,查询字符会变成209950个字符吗?查询是否有字符限制?您的子查询似乎缺少
from
子句
select
key1 as ITEMID,
value1 as SELLERID
UNION ALL
select
key2,
value2
UNION ALL
// and so on...
它到底是怎么工作的?看起来数据库(出人意料地)正在克服这一点,然后对数据集进行笛卡尔分析——这导致内存急剧增加,无法处理
你应该试试:
select
key1 as ITEMID,
value1 as SELLERID
from
yourTableName
UNION ALL
select
key2,
value2
from
yourTableName
Union all // etc etc
话虽如此,为什么不加入包含where子句的子查询以获取所需的行,或者在它们之间使用查找表呢?创建一个临时表并插入其中
create temporary table mytable (itemid integer, sellerid integer);
insert into mytable (itemid, sellerid) values
(1,2),(2,10)
;
SELECT
table1.column1,
table1.column2,
table1.column3,
table2.column1,
table2.column2
FROM
item as table1
INNER JOIN mytable as KEY_VALUE
ON table1.item_id = KEY_VALUE.ITEMID
INNER JOIN
item_sellers as table2
ON table1.item_id = table2.item_id
AND table2.seller_id = KEY_VALUE.SELLERID
WHERE table1.active = 1
;
drop table mytable;
sql字符串长度将小得多。将其放在末尾。此查询的目的是什么?它看起来很糟糕,应该重写,但我不知道它首先应该做什么。我需要物品和卖家信息,我所拥有的只是一堆物品ID和卖家ID及其映射,即一堆键值对映射。您能建议一下如何重写查询吗?谢谢您的回复,但我没有从任何表中获取key1,value1和key2,value2,我是从另一个业务逻辑中获取的,在运行此查询之前,我会将其保存在映射中,因此,我正在形成一个无from子句的union all查询。@Ranjith虽然我发布了一个答案,但我认为符合您的策略,我猜您所指的业务逻辑是从某个数据库获取数据的。如果这是真的,那么为什么不将业务逻辑转换为sql呢?