mysql - SQL 连接大数据

标签 mysql sql join inner-join

我有这个加入:

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/

相关文章:

mysql - 使用UNION/INNER JOIN使用SQL连接3个表来绘制数据

php - 如何将不带换行符的字符串连接到 MySQL 中?

mysql - dll MATLAB,dll DBMS,blob?

python - 生成 SQL "IN"子句 : how to safely handle input + empty value lists?

sql - 如何在 Django 中为用户模型加载 sql fixture ?

mysql - 如何基于列合并两个表?

MySql 自连接子内部连接返回交叉连接

mysql - 列出两个表之间的前 10 个结果

c++ - 使用 Qt 解析 JSON

mysql - 处理每个组的列中的值