请帮助我优化以下查询,此查询需要超过 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)
请帮助我理解两个查询是否扫描相同数量的记录,然后为什么两个查询的执行时间不同?并且善意地建议更好的方式来编写上述查询。
答案 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
(每个);我想比较缓冲池大小。