左连接ISNULL条件查询需要很长时间才能在MySQL RDS上执行

时间:2017-03-30 06:09:09

标签: mysql innodb performance-testing rds mysqltuner

请帮助我优化以下查询,此查询需要超过 60 mints 才能执行 ISNULL 条件,但如果我们更换 ISNULL < => 条件,它执行了 15 mints ,但我们期望这个查询最多需要2分钟。

两张表都有: - 3880494条记录。

SELECT hs.headendid FROM headendlineups_stagging hs LEFT JOIN headendlineups_23march2017 hlp ON hs.headendid=hlp.headendid WHERE ISNULL(hlp.headendid)

用< =>替换ISNULL操作

SELECT hs.headendid,hlp.headendid AS productionheadend
FROM headendlineups_stagging hs  
LEFT JOIN  headendlineups_23march2017 hlp ON hs.headendid=hlp.headendid
-- WHERE ISNULL(hlp.headendid)
WHERE hlp.headendid <=> NULL;

解释两个查询

**mysql> EXPLAIN
    ->  SELECT hs.headendid
    ->  FROM headendlineups_stagging hs
    ->  LEFT JOIN headendlineups_23march2017 hlp ON hs.headendid=hlp.headendid
    ->  WHERE ISNULL(hlp.headendid)\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: hs
   partitions: NULL
         type: index
possible_keys: NULL
          key: IX_lineups_headendid
      key_len: 198
          ref: NULL
         rows: 3854774
     filtered: 100.00
        Extra: Using index
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: hlp
   partitions: NULL
         type: ref
possible_keys: IX_lineups_headendid,iDX_linups_NEW,New_headends_linup
          key: IX_lineups_headendid
      key_len: 153
          ref: onconnectdb.hs.HeadendId
         rows: 217
     filtered: 100.00
        Extra: Using where; Using index
2 rows in set, 1 warning (0.00 sec)**


mysql> EXPLAIN
    -> SELECT hs.headendid,hlp.headendid AS productionheadend
    -> FROM headendlineups_stagging hs
    -> LEFT JOIN  headendlineups_23march2017 hlp ON hs.headendid=hlp.headendid
    -> WHERE hlp.headendid <=> NULL\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: hs
   partitions: NULL
         type: index
possible_keys: NULL
          key: IX_lineups_headendid
      key_len: 198
          ref: NULL
         rows: 3854774
     filtered: 100.00
        Extra: Using index
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: hlp
   partitions: NULL
         type: ref
possible_keys: IX_lineups_headendid,iDX_linups_NEW,New_headends_linup
          key: IX_lineups_headendid
      key_len: 153
          ref: onconnectdb.hs.HeadendId
         rows: 217
     filtered: 100.00
        Extra: Using where; Using index
2 rows in set, 1 warning (0.00 sec)

请帮助我理解两个查询是否扫描相同数量的记录,然后为什么两个查询的执行时间不同?并且善意地建议更好的方式来编写上述查询。

1 个答案:

答案 0 :(得分:0)

时间的差异很可能是缓存;再次运行每一个。

LEFT JOIN更改为NOT EXISTS ( SELECT * FROM headendlineups_23march2017 hlp WHERE hs.headendid=hlp.headendid )(可能会有所帮助。也可能没用。

基于EXPLAINs,它正在尽力而为 - 即两个表上的Using index。面对它,你必须扫描整个第一张表380万次,然后检查第二张表380万次。

多少内存? innodb_buffer_pool_size的价值是多少? SHOW TABLE SIZE(每个);我想比较缓冲池大小。