我有这个加入:
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 命令。
谢谢
最佳答案
网络上的许多资源建议在主查询之前将 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;
关于mysql - SQL 连接大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20052583/