在旧表上创建SQL索引

问题描述 投票:0回答:1

我有一个查询,显示所有工人在上周的第一次轮班,它是从两个表中收集的,看起来像这样:

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

mysql sql indexing workbench
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.