Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化MySQL不在(查询)中_Mysql_Query Optimization_Notin - Fatal编程技术网

优化MySQL不在(查询)中

优化MySQL不在(查询)中,mysql,query-optimization,notin,Mysql,Query Optimization,Notin,我正在尝试优化此MySQL查询。我想统计在查看当前约会之前没有约会的客户数量。换句话说,如果他们有一个not In子查询正在检查的约会,则排除他们 但是,这个查询绝对会破坏性能。我知道MySQL在非IN查询中不是很好,但我不确定优化这个查询的最佳方法。运行这个查询需要15到30秒。我已经在CustNo、AptStatus和AptNum上创建了索引 SELECT COUNT(*) AS NumOfCustomersWithPriorAppointment,

我正在尝试优化此MySQL查询。我想统计在查看当前约会之前没有约会的客户数量。换句话说,如果他们有一个not In子查询正在检查的约会,则排除他们

但是,这个查询绝对会破坏性能。我知道MySQL在非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语句。

请为查询中的每个表提供SHOW CREATE TABLE语句。BEGIN\u query\u DATE是常量?还是另一列?使用LEFT JOIN.重写查询。为空;告诉我们是否更快。顺便说一句,您的join a真的是一个内部join这个查询准确无误。非常感谢您的帮助和建议!