SELECT DISTINCT items.itemid
FROM billingdata
LEFT OUTER JOIN items
ON items.itemid = billingdata.itemid
WHERE billingdata.encounterid IN (SELECT encounterid
FROM enc
WHERE patientid = 301487
AND date < '2014-08-21'
AND enctype <> 8
AND deleteflag = 0)
ORDER BY billingdata.displayindex;
在此查询中,在 itemid、billingdata.encounterid、patientid 中有索引。
这个查询的执行计划是这样的: 它没有在 billingdata 表上显示任何索引。此表中影响的大多数行 enc 表的 encounterid 显示在索引中。
第一次大约需要 18 秒。之后需要 1.8 秒。但它也很慢。
有什么解决办法?
最佳答案
我的理解是,当查找 IN 的纯粹存在时,RDBMS 中的运行速度最快。
所以这可能更有效,但 enc 和 billingdata 中 encounterID 的索引会产生很大的不同。
SELECT DISTINCT items.itemid
FROM billingdata
LEFT OUTER JOIN items
ON items.itemid = billingdata.itemid
WHERE exists (SELECT 1
FROM enc
WHERE patientid = 301487
AND date < '2014-08-21'
AND enctype <> 8
AND deleteflag = 0
AND enc.encounterID = billingdata.encounterid)
ORDER BY billingdata.displayindex;
甚至连接可以更快,具体取决于索引..
SELECT DISTINCT items.itemid
FROM billingdata
INNER JOIN enc
ON ENC.EncounterID = BillingData.EncounterID
AND patientid = 301487
AND date < '2014-08-21'
AND enctype <> 8
AND deleteflag = 0
LEFT OUTER JOIN items
ON items.itemid = billingdata.itemid
ORDER BY billingdata.displayindex;
关于mysql - 查询需要很长时间才能执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25435162/