gpt4 book ai didi

mysql - MySQL 中的慢速子查询

转载 作者:可可西里 更新时间:2023-11-01 07:57:19 25 4
gpt4 key购买 nike

我正在尝试使用 CodeIgniter 和 Datatables.net 生成报告。

现在我正在尝试关闭工作的数量(它是一个人力资源系统)。我曾经查询所有作业,并在 PHP 中执行 foreach,然后进行计算。

因为我想使用 Datatables 的所有功能(特别是排序)我试图在 mySQL 中进行所有计算。

问题是:第二个子查询非常非常慢。

SELECT 
jobs.jobs_id, clients.nome_fantasia, concat_ws(' ', user_profiles.first_name, user_profiles.last_name) as fullname,
jobs.titulo_vaga, jobs.qtd_vagas, company.name as nome_company, jobs_status.name as status_name, DATEDIFF(NOW(), jobs.data_abertura) as date_idade,
(select count(job_cv.jobs_id) from job_cv where job_cv.jobs_id = jobs.jobs_id) as qtd_int,
(select count(distinct job_cv.user_id) from job_cv_history join job_cv on job_cv.job_cv_id = job_cv_history.job_cv_id where job_cv_history.status = '11' and job_cv.jobs_id = jobs.jobs_id ) as fechadas
FROM (jobs)
JOIN clients ON lients.clients_id=jobs.clients_idJOIN user_profiles ON jobs.consultor_id=user_profiles.user_id
JOIN jobs_status ON jobs.status=jobs_status.jobs_status_id
JOIN company ON jobs.company_id=company.company_id
LIMIT 50

有人可以帮助我吗?如果需要,我可以提供更多信息。

更新

使用 JOIN 而不是 SELECT 的想法适用于第一个子查询,但第二个子查询不行,有没有办法传递一个“变量”以在子查询中使用?喜欢当前的 jobs_id 吗?

再次更新

这条线本身运行良好。但是在子查询内部需要大约一分钟的时间来处理磨损的值

SELECT job_cv.jobs_id,count(distinct job_cv.user_id) AS fechadas
FROM job_cv_history
JOIN job_cv
ON job_cv.job_cv_id = job_cv_history.job_cv_id
WHERE job_cv_history.status = '11'
GROUP BY job_cv.jobs_id

最佳答案

慢的不是子查询。事实上,您正在为从外部查询返回的每一行执行这些子查询。将它们移至联接,您应该会观察到性能的提高。

SELECT 
jobs.jobs_id, clients.nome_fantasia, concat_ws(' ', user_profiles.first_name, user_profiles.last_name) as fullname,
jobs.titulo_vaga, jobs.qtd_vagas, company.name as nome_company, jobs_status.name as status_name, DATEDIFF(NOW(), jobs.data_abertura) as date_idade,
qtd.qtd_int,
fechadas.fechadas
FROM (jobs)
JOIN clients ON lients.clients_id=jobs.clients_idJOIN user_profiles ON jobs.consultor_id=user_profiles.user_id
JOIN jobs_status ON jobs.status=jobs_status.jobs_status_id
JOIN company ON jobs.company_id=company.company_id
JOIN (
SELECT jobs_id, count(jobs_id) AS qtd_int FROM job_cv GROUP BY jobs_id
) AS qtd ON qtd.jobs_id = jobs.jobs_id
JOIN (
SELECT job_cv.user_id, count(distinct job_cv.user_id) AS fechadas
FROM job_cv_history
JOIN job_cv
ON job_cv.job_cv_id = job_cv_history.job_cv_id
WHERE job_cv_history.status = '11'
GROUP BY job_cv.user_id
) AS fechadas ON job_cv.jobs_id = jobs.jobs_id
LIMIT 50

关于mysql - MySQL 中的慢速子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6864446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com