【问题标题】:Creating SQL indexes on old tables在旧表上创建 SQL 索引
【发布时间】:2020-03-23 11:18:27
【问题描述】:

我有一个查询显示上周第一次轮班的所有工人,它是从两个表中收集的,如下所示:

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

【问题讨论】:

  • 您通常 GROUP BY 与您 SELECT 相同的列,除了那些是设置函数的参数的列。

标签: mysql sql indexing workbench


【解决方案1】:

我建议你这样写查询:

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)

【讨论】:

  • 谢谢!索引查询应该在 SQL 查询之前还是之后发布?如果我做一次,我是否必须再做一次?我是否正确,它看起来像这样: CREATE INDEX tempnr ON contactstable(contact_type, temp_nr, first_name, last_name)
  • @Frederik。 . .应该在运行查询之前创建索引。是的,您拥有创建索引的正确语法。
猜你喜欢
  • 2013-10-24
  • 2013-11-27
  • 1970-01-01
  • 2013-06-02
  • 2023-03-16
  • 1970-01-01
  • 2018-10-22
  • 2015-11-17
相关资源
最近更新 更多