我有以下的MySQL查詢,完美的作品,但有時運行速度慢得令人難以置信。優化我的查詢,使用IFNULL,JOIN和在哪裏在
SELECT s.ID AS `Student_ID` , IFNULL(COUNT(f.ID) , 0) AS `Flags` , IFNULL(COUNT(i.ID) , 0) AS `Interventions`
FROM `frog_shared`.`student` s
LEFT JOIN `frog_flags`.`flags` f ON s.ID = f.`Student_ID`
LEFT JOIN `frog_flags`.`interventions` i ON s.ID = i.`Student_ID`
WHERE s.ID
IN (132336)
GROUP BY s.ID
ORDER BY s.Surname ASC , s.Firstname DESC
基本上,給學生ID列表,我希望我的系統返回的,他們已經收到Flags
的數量和Interventions
數量。
但是,當有30名學生的列表時,查詢需要花費將近一秒的時間。
查詢的結果時EXPLAIN
版如下:
我有student.id
和flags.Student_ID
索引,所以我不認爲這就是問題所在。
如何優化我的查詢?
UPDATE:SHOW CREATE
TABLES
CREATE TABLE `interventions` (
`ID` int(10) NOT NULL auto_increment,
`Visible` int(1) NOT NULL,
`Student_ID` int(6) NOT NULL COMMENT 'FK frog_shared.student',
`Staff_ID` int(6) NOT NULL COMMENT 'FK frog_shared.staff',
`Datetime` datetime NOT NULL,
`Category_ID` int(3) NOT NULL COMMENT 'FK intervention_categories',
`Generation_Type` varchar(1) NOT NULL COMMENT '[A]utomated or [M]anual',
`Reason` text NOT NULL,
`Status` varchar(1) NOT NULL COMMENT '[O]pen, In [P]rogress, [C]losed',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1
CREATE TABLE `flags` (
`ID` int(10) NOT NULL auto_increment,
`Student_ID` int(6) NOT NULL COMMENT 'FK frog_shared.student',
`Staff_ID` int(6) NOT NULL COMMENT 'FK frog_shared.staff',
`Datetime` datetime NOT NULL,
`Period_ID` int(2) NOT NULL COMMENT 'FK frog_shared.periods',
`Location_ID` int(3) NOT NULL COMMENT 'FK frog_shared.locations',
`Category_ID` int(2) NOT NULL COMMENT 'FK flag_categories',
`Alert_ID` int(11) default NULL COMMENT 'FK frog_alerts.alerts',
`Action_Taken_Category_ID` int(1) default NULL COMMENT 'FK frog_flags.categories FA',
`Action_Taken_Status` varchar(1) default NULL COMMENT '[P]ending or [C]omplete',
`Details` text NOT NULL,
PRIMARY KEY (`ID`),
KEY `Student_ID` (`Student_ID`),
KEY `Staff_ID` (`Staff_ID`),
KEY `Datetime` (`Datetime`)
) ENGINE=InnoDB AUTO_INCREMENT=3669 DEFAULT CHARSET=latin1
CREATE TABLE `student` (
`id` varchar(20) default NULL,
`UPN` varchar(25) NOT NULL,
`Firstname` varchar(50) NOT NULL,
`Surname` varchar(50) NOT NULL,
`Year_Group` int(2) NOT NULL,
`Tutor_Group` varchar(15) NOT NULL,
`SEN_Status` varchar(1) default NULL,
`Flags` varchar(10) default NULL,
PRIMARY KEY (`UPN`),
KEY `id` (`id`),
KEY `Year_Group` (`Year_Group`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
對不起,我不明白這個問題? – dunc
你到目前爲止嘗試過哪些方法來優化它,它是靜態IN(132336)?或來自變量。 – developerCK
我還沒有真正嘗試過任何東西 - 我不知道從哪裏開始。'IN'命令由PHP動態填充,因此它可以是'IN(13141)'或它可以是'IN(121,131,141,155,142,144,...)等。 – dunc