我有一个查询,显示所有工人在上周的第一次轮班,它是从两个表中收集的,看起来像这样:
SELECT MIN(p.start_date), CONCAT(c.first_name, ' ', c.last_name) AS 'c.fullname', c.temp_nr
FROM contactstable c
LEFT JOIN projectlines p on c.temp_nr = p.candidate_number
WHERE c.contact_type = 'Candidate'
GROUP BY c.temp_nr
HAVING
MIN(p.start_date)
between
DATE_SUB(CURDATE(), INTERVAL (dayofweek(CURDATE())+6) DAY)
AND DATE_SUB(CURDATE() , INTERVAL (dayofweek(CURDATE())) DAY)
我的问题是查询超时,因此据我了解,我需要添加索引,但是在多个站点上进行搜索后,我仍然不知道如何执行此操作。
我正在使用Workbench 8.0
我建议您这样编写查询:
SELECT CONCAT(c.first_name, ' ', c.last_name) AS fullname, c.temp_nr,
(SELECT MIN(p.start_date)
FROM projectlines p
WHERE c.temp_nr = p.candidate_number
) as min_start_date
FROM contactstable c
WHERE c.contact_type = 'Candidate'
HAVING min_start_date BETWEEN DATE_SUB(CURDATE(), INTERVAL (dayofweek(CURDATE())+6) DAY) AND
DATE_SUB(CURDATE() , INTERVAL (dayofweek(CURDATE())) DAY);
然后为此,您希望在以下位置建立索引:
contactstable(contact_type, temp_nr, first_name, last_name)
projectlines(candidate_number, start_date)
。