我有一個MySQL查詢,用於確定是否有一個設備(只有3個設備)被同時使用四個併發事件。我有一個工作查詢,但它似乎效率低下,我很好奇,如果有更好的方式來做選擇。選擇符合條件的四個併發事件MySQL
表結構(與查詢無關的列已被刪除)該表當前包含大約7-8k行。
CREATE TABLE IF NOT EXISTS `tc_event` (
`WorkOrderNumber` int(11) NOT NULL DEFAULT '0',
`EventName` varchar(120) DEFAULT NULL,
`CrewStartTime` datetime DEFAULT NULL,
`CrewEndTime` datetime DEFAULT NULL,
`SoundConsole` varchar(30) DEFAULT NULL,
`Canceled` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`WorkOrderNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
電流(工作)查詢:
SELECT UNIX_TIMESTAMP(T1.CrewStartTime) AS ConflictDate
FROM tc_event T1, tc_event T2, tc_event T3, tc_event T4
WHERE
(T1.CrewStartTime BETWEEN T2.CrewStartTime AND T2.CrewEndTime)
AND (T1.CrewStartTime BETWEEN T3.CrewStartTime AND T3.CrewEndTime)
AND (T1.CrewStartTime BETWEEN T4.CrewStartTime AND T4.CrewEndTime)
AND (T2.CrewSTartTime BETWEEN T3.CrewStartTime AND T3.CrewEndTime)
AND (T2.CrewStartTime BETWEEN T4.CrewStartTime AND T4.CrewEndTime)
AND (T3.CrewStartTime BETWEEN T4.CrewStartTime AND T4.CrewEndTime)
AND T1.WorkOrderNumber != T2.WorkOrderNumber
AND T1.WorkOrderNumber != T3.WorkOrderNumber
AND T1.WorkOrderNumber != T4.WorkOrderNumber
AND T2.WorkOrderNumber != T3.WorkOrderNumber
AND T2.WorkOrderNumber != T4.WorkOrderNumber
AND T3.WorkOrderNumber != T4.WorkOrderNumber
AND T1.CrewStartTime > NOW()
AND T1.SoundConsole = '12-Chan/PA-12'
AND T2.SoundConsole = '12-Chan/PA-12'
AND T3.SoundConsole = '12-Chan/PA-12'
AND T4.SoundConsole = '12-Chan/PA-12'
AND (T1.Canceled = 0 AND T1.EventName NOT LIKE '%*NOTC*%')
AND (T2.Canceled = 0 AND T2.EventName NOT LIKE '%*NOTC*%')
AND (T3.Canceled = 0 AND T3.EventName NOT LIKE '%*NOTC*%')
AND (T4.Canceled = 0 AND T4.EventName NOT LIKE '%*NOTC*%')
GROUP BY DATE(T1.CrewStartTime)
ORDER BY T1.CrewStartTime
查詢EXPLAIN語句:
只要有一個快速瀏覽一下你的'CrewStartTime BETWEEN ...'的事情,是不是隻是一個平等喜歡這個?至少有一些是無用的,你正在檢查T4與T4之間的T3與T3之間的T2,在那種情況下檢查T4與T4之間的關係是沒有用的。 – Wolph