Mid*_*ane 1 mysql sql optimization
大家好.这是这个问题的后续内容:
在获得正确的数据并根据业务请求进行一些调整之后,我现在已经掌握了这个小型野兽.此查询应返回新求职者注册的总数和新上传的CV的数量:
SELECT COUNT(j.jobseeker_id) as new_registrations,
(
SELECT
COUNT(c.cv_id)
FROM
tb_cv as c, tb_jobseeker, tb_industry
WHERE
UNIX_TIMESTAMP(c.created_at) >= '1241125200'
AND
UNIX_TIMESTAMP(c.created_at) <= '1243717200'
AND
tb_jobseeker.industry_id = tb_industry.industry_id
)
AS uploaded_cvs
FROM
tb_jobseeker as j, tb_industry as i
WHERE
j.created_at BETWEEN '2009-05-01' AND '2009-05-31'
AND
i.industry_id = j.industry_id
GROUP BY i.description, MONTH(j.created_at)
Run Code Online (Sandbox Code Playgroud)
注意: - UNIX TIMESTAMP函数中的两个值作为参数从我们后端的报告模块传入.
每次我运行它时,MySQL都会悄悄地扼杀并插入到Interweb的以太网中.
感谢帮助.
更新:嘿伙计们.非常感谢所有深思熟虑和乐于助人的评论.我在这里只有2周的时间,所以我还在学习架构.所以,这个查询介于一个顽固的猜测之间.现在开始回答你的所有问题.
tb_cv未连接到子查询中的其他表.我想这是慢查询的根本原因.它会导致生成笛卡尔积,产生的行数比您可能需要的多得多.
除此之外,我会说你需要索引tb_jobseeker.created_at,tb_cv.created_at并且tb_industry.industry_id,你可能想要摆脱UNIX_TIMESTAMP()子查询中的调用,因为它们阻止使用索引.请改用BETWEEN实际字段值.
这是我尝试理解您的查询并编写更好的版本.我想你想得到每个行业每月新求职者注册和新上传的简历数量:
SELECT
i.industry_id,
i.description,
MONTH(j.created_at) AS month_created,
YEAR(j.created_at) AS year_created,
COUNT(DISTINCT j.jobseeker_id) AS new_registrations,
COUNT(cv.cv_id) AS uploaded_cvs
FROM
tb_cv AS cv
INNER JOIN tb_jobseeker AS j ON j.jobseeker_id = cv.jobseeker_id
INNER JOIN tb_industry AS i ON i.industry_id = j.industry_id
WHERE
j.created_at BETWEEN '2009-05-01' AND '2009-05-31'
AND cv.created_at BETWEEN '2009-05-01' AND '2009-05-31'
GROUP BY
i.industry_id,
i.description,
MONTH(j.created_at),
YEAR(j.created_at)
Run Code Online (Sandbox Code Playgroud)
在编写查询时我注意到的一些事情:
COUNT.)