我试图优化这个MySQL查询,我想知道当前约会之前没有预约的客户数量,换句话说,if他们有一个约会(这是什么NOT IN(子查询正在检查),然后排除它们。)优化一个MySQL NOT IN(查询
但是,这个查询是绝对杀死性能。我知道,MySQL不是非常好的查询,但我无法确定优化此查询的最佳方式,它需要15到30秒的时间才能运行,我已在CustNo,AptStatus和AptNum上创建了索引
SELECT
COUNT(*) AS NumOfCustomersWithPriorAppointment,
FROM
transaction_log AS tl
LEFT JOIN
appointment AS a
ON
a.AptNum = tl.AptNum
INNER JOIN
customer AS c
ON
c.CustNo = tl.CustNo
WHERE
a.AptStatus IN (2)
AND a.CustNo NOT IN
(
SELECT
a2.CustNo
FROM
appointment a2
WHERE
a2.AptDateTime < a.AptDateTime)
AND a.AptDateTime > BEGIN_QUERY_DATE
AND a.AptDateTime < END_QUERY_DATE
预先感谢您。
请为您的查询中的每个表提供'SHOW CREATE TABLE'语句。 –
BEGIN_QUERY_DATE是常量吗?或另一列?用'LEFT JOIN .. IS NULL'重写查询;告诉我们它是否更快。 –
顺便提一下,你的外部连接(a)实际上是一个内部连接 – Strawberry