优化 MySQL NOT IN( 查询

3C41DC

我正在尝试优化此 MySQL 查询。我想计算在查看当前约会之前没有约会的客户数量。换句话说,如果他们有约会(这是 NOT IN( 子查询正在检查的内容),则排除他们。

然而,这个查询绝对是在扼杀性能。我知道 MySQL 在 NOT IN( 查询方面不是很好,但我不确定优化此查询的最佳方法。运行需要 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

先感谢您。

威廉·伦泽马

请尝试以下操作:

SELECT
        COUNT(*)             AS NumOfCustomersWithPriorAppointment,
FROM 
        transaction_log AS tl
INNER JOIN
        appointment AS a
ON
        a.AptNum = tl.AptNum
LEFT OUTER JOIN appointment AS earlier_a
        ON earlier_a.CustNo = a.CustNo
        AND earlier_a.AptDateTime < a.AptDateTime
INNER JOIN
        customer AS c
ON
        c.CustNo = tl.CustNo
WHERE
        a.AptStatus  IN (2)
AND     earlier_a.AptNum IS NULL


AND     a.AptDateTime > BEGIN_QUERY_DATE
AND     a.AptDateTime < END_QUERY_DATE

这将受益于 上的复合索引(CustNo,AptDateTime)如果它适合您的业务模型,就让它独一无二(从逻辑上讲它应该是,但实际上可能不是,这取决于您如何处理应用程序中的冲突。)

SHOW CREATE TABLE如果这不会产生足够的性能改进,则为所有表提供语句。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章