Mysql 如何优化此sql查询?

Mysql 如何优化此sql查询?,mysql,sql,Mysql,Sql,这里有四张桌子 待定标准工作时间 tbl_出席率 tbl_假日酒店 tbl_离开 我想通过此查询查找员工缺勤报告…但我将此应用于许多员工时需要花费很多时间…是否有任何方法可以简化此查询 SELECT date FROM tbl_std_working_hour WHERE date NOT IN (SELECT date FROM tbl_attendance WHERE emp_id = '$emp_id') AND date NOT IN (SELECT date FROM tbl_holi

这里有四张桌子

待定标准工作时间 tbl_出席率 tbl_假日酒店 tbl_离开 我想通过此查询查找员工缺勤报告…但我将此应用于许多员工时需要花费很多时间…是否有任何方法可以简化此查询

SELECT date
FROM tbl_std_working_hour
WHERE date NOT IN (SELECT date FROM tbl_attendance WHERE emp_id = '$emp_id')
AND date NOT IN (SELECT date FROM tbl_holiday)
AND date NOT IN (SELECT date FROM tbl_leave WHERE emp_id = '$emp_id')
AND total_hour <> '00:00:00'
AND date >= '$start'
AND date <= '$end'
AND emp_id = '$emp_id'

首先,我将使用NOT EXISTS重写:

然后添加以下复合多列索引:

tbl_标准工作小时P_id、日期、总小时 tbl_出席者姓名、日期 如果date是主键或唯一键,则tbl_holidaydate可能已经存在 如果emp_id是主键或唯一的,则tbl_leveemp_id可能已经存在
注意,我将子查询更改为在外部查询中引用emp_id。这使得更改emp_id更容易。此外,您的查询应该使用WHERE子句中的值的参数。

这也是一种更好的方法,可以更好地使用UNION ALL


tbl_holiday不包含emp_id…。因此它在where子句“更新请检查”中给出了类似1054-未知列“th.emp_id”的错误。@Suraz。实际上,union all并不是更好,因为它可能会阻止在MySQL中的各个表上使用索引。@Kabir。不工作是相当模糊的。您应该更具体地说明问题。请参阅
SELECT wh.date
FROM tbl_std_working_hour wh
WHERE NOT EXISTS (SELECT 1
                  FROM tbl_attendance a
                  WHERE a.date = wh.date AND a.emp_id = wh.emp_id
                 ) AND
      NOT EXISTS (SELECT 1
                  FROM tbl_holiday h
                  WHERE h.date = wh.date
                 ) AND
      NOT EXISTS (SELECT 1
                  FROM tbl_leave l
                  WHERE l.emp_id = wh.emp_id and l.date = wh.date
                 )
WHERE wh.total_hour <> '00:00:00' AND
      wh.date >= '$start' AND
      wh.date <= '$end' AND
      wh.emp_id = '$emp_id';
SELECT date
FROM tbl_std_working_hour AS tswh
WHERE NOT EXISTS(
    SELECT date FROM tbl_attendance ta WHERE ta.date = tswh.date AND ta.emp_id = tswh.emp_id
    UNION ALL
    SELECT date FROM tbl_holiday th WHERE th.date = tswh.date
    UNION ALL
    SELECT date FROM tbl_leave tl WHERE tl.date = tswh.date AND tl.emp_id = tswh.emp_id)
AND total_hour <> '00:00:00'
AND date >= '$start'
AND date <= '$end'
AND emp_id = '$emp_id'