我有这个加入:
SELECT a.*
FROM `entities_instance` a
INNER JOIN `instance_fields_data` artists
ON ( a.entity_instance_id = artists.entity_instance_id
AND artists.`dynamic_field_name` = 'artists'
AND artists.`field_value` like '%8605:%')
INNER JOIN `instance_fields_data` _enddate
ON (a.entity_instance_id = _enddate.entity_instance_id)
AND (_enddate.`dynamic_field_name` = 'enddate')
WHERE a.`entity_id` = 67
GROUP BY a.entity_instance_id
ORDER BY _enddate.field_value DESC
LIMIT 100
它需要返回大约5个结果,但我得到了这个错误:
The SELECT would examine more than MAX_JOIN_SIZE rows;
check your WHERE and use SET SQL_BIG_SELECTS=1 or
SET MAX_JOIN_SIZE=# if the SELECT is okay
有人可以帮我改进这个查询吗? 我不想使用SQL_BIG_SELECTS命令。
谢谢
答案 0 :(得分:0)
网上的许多资源建议在主查询之前将SQL_BIG_SELECTS=1
作为单独的查询运行。
我在想,也许您可以尝试使用别名表来执行较小数据大小的连接。不确定,但它可以帮助。
示例:强>
select a.* from
(select * from `entities_instance` test WHERE test.`entity_id` = 67) as a
INNER JOIN `instance_fields_data` artists
ON ( a.entity_instance_id = artists.entity_instance_id
AND artists.`dynamic_field_name` = 'artists'
AND artists.`field_value` like '%8605:%')
INNER JOIN `instance_fields_data` _enddate
ON (a.entity_instance_id = _enddate.entity_instance_id)
AND (_enddate.`dynamic_field_name` = 'enddate')
GROUP BY a.entity_instance_id
ORDER BY _enddate.field_value DESC
LIMIT 100;
为了提供更多帮助,您可以获得数据和表格结构的示例。 例如。我们甚至不知道哪个表是数据最多的表。
<强>例2:强>
这里我将为3个表中的每个表获取where语句,并在别名派生表中使用它们。
SELECT a.*
FROM
(SELECT *
FROM `entities_instance` test
WHERE test.`entity_id` = 67) AS a,
(SELECT *
FROM `instance_fields_data` test2
WHERE test2.`dynamic_field_name` = 'artists'
AND test2.`field_value` LIKE '%8605:%') AS artists,
(SELECT *
FROM `instance_fields_data` test3
WHERE test3.`dynamic_field_name` = 'enddate') AS _enddate
WHERE a.entity_instance_id = artists.entity_instance_id
AND a.entity_instance_id = _enddate.entity_instance_id
GROUP BY a.entity_instance_id
ORDER BY _enddate.field_value DESC LIMIT 100;
<强>示例3:强>
最后,在此进一步优化中,我们使用EXISTS
来进一步过滤instance_fields_data
的两个子查询的结果。我确信这可以进一步简化/优化。还要确保您的密钥上有索引(例如entity_instance_id),否则这将更慢。
SELECT a.*
FROM
(SELECT *
FROM `entities_instance` test
WHERE test.`entity_id` = 67) AS a,
(SELECT *
FROM `instance_fields_data` test2
WHERE test2.`dynamic_field_name` = 'artists'
AND test2.`field_value` LIKE '%8605:%'
AND EXISTS
(SELECT *
FROM `entities_instance` z
WHERE z.entity_instance_id = test2.entity_instance_id AND
z.`entity_id` = 67)) AS artists,
(SELECT *
FROM `instance_fields_data` test3
WHERE test3.`dynamic_field_name` = 'enddate'
AND EXISTS
(SELECT *
FROM `entities_instance` z
WHERE z.entity_instance_id = test3.entity_instance_id AND
z.`entity_id` = 67)) AS _enddate
WHERE a.entity_instance_id = artists.entity_instance_id
AND a.entity_instance_id = _enddate.entity_instance_id
GROUP BY a.entity_instance_id
ORDER BY _enddate.field_value DESC LIMIT 100;