Mysql联合子查询优化

标签 mysql optimization limit union

我的问题是这个查询:

(SELECT    
     ID1,ID2,ID3,ID4,ID5,ID10,ID11,ID13,ID14,ID454,ID453,
     TIME,TEMP_ID,'ID_AUTO',PREDAJCA,VYTVORIL,MAIL,TEMP_ID_HASH,ID_SEND 
   FROM `load_send_calc` 
   WHERE `TEMP_ID` LIKE '$find%' 
     AND ACTIVE = 1 AND TEMP_ID > 0)
UNION ALL
(SELECT 
     ID1,ID2,ID3,ID4,ID5,ID10,ID11,ID13,ID14,ID454,ID453,TIME,'',
     ID_AUTO,'','','','','' 
  FROM `temp` 
  WHERE `ID_AUTO` LIKE '$find%' 
    AND `ID_AUTO` NOT IN (SELECT TEMP_ID 
                            FROM `load_send_calc` 
                            WHERE `load_send_calc`.ACTIVE = 1)
)
ORDER BY TIME  DESC LIMIT $limitFrom,$limitTo;

load_send_calc中有18000条记录,表temp中有3000条记录。查询本身的执行时间超过 2 分钟。有什么办法可以优化这个时间吗?

我已经尝试将顺序放入每个子查询中,但没有太大帮助。我真的很绝望,所以我真的很感谢任何形式的帮助。

编辑: 这是解释结果:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY load_send_calc  ALL NULL    NULL    NULL    NULL    18394   Using where
2   UNION   temp    ALL NULL    NULL    NULL    NULL    1918    Using where
3   DEPENDENT SUBQUERY  load_send_calc  ALL NULL    NULL    NULL    NULL    18394   Using where
NULL    UNION RESULT    <union1,2>  ALL NULL    NULL    NULL    NULL    NULL    Using filesort

最佳答案

感谢您添加解释输出 - 它告诉了我们很多信息。该查询不使用单个索引,这对性能非常不利。一个非常简单的优化是在 join 中使用的字段上添加索引。 ,以及 where条款。在您的情况下,这些字段将是:

load_send_calc.temp_id
load_send_calc.active
temp.id_auto

除了这些之外,你还有一个不必要的 AND TEMP_ID > 0 ,因为您已经限制了与 WHERE TEMP_ID LIKE '$find%' 相同的字段

关于Mysql联合子查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29671522/

相关文章:

c++ - 改进值(value)散列

PHP PDO 选择并输出第一个找到的行结果

php - 限制返回的行数 - mysql

php - Laravel 5.2 Model.php 关系方法异常

php - PHP 和 MD5 哈希中的更改密码脚本

选择随机记录并在一个查询中更新相同的记录?

python - 一种快速查找列表交集元素数量的方法(Python)

c++ - 优化 volatile 堆栈变量的存储/构造是否合法?

sql - 逻辑变化存在与存在限制 1

mysql - LEFT() 函数从其中的字符串中提取多个字符