2011-07-28 6 views
3

imはCodeIgniterとDatatables.netを使用してレポートを生成しようとしています。MySQLのサブクエリが遅い

私は閉鎖された仕事(その人事制度)の量を試しています。私はすべてのジョブを照会するために使用し、PHPではforeachを行い、次にcalcを実行します。

私は、Datatablesのすべての機能(特にソート)を使用したいので、imはmySQLですべての計算を実行しようとしています。

問題は次のとおりです。2番目のサブクエリは非常に非常に遅いです。

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 

誰かが私を助けることができますか?必要に応じてもっと情報を提供することができます。

UPDATE

アイデアではない、道は「変数」のサブクエリ内で使用するためにそこに合格する最初のサブクエリではなく第二1で代わりにSELECT仕事をJOINを使用するには?現在のjobs_idのように?

UPDATE AGAIN

この行は、それ自体で正常に動作します。サブクエリの内部では、値が1分ほどかかります

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 

答えて

3

は、それは遅い副問合せされていません。 は左があなたのケースに参加すると、パフォーマンスが向上したりしませ

+1

TKz ...私は仕事にこれを思いついた:http://pastebin.com/rzjAW7Sj firtsはqtdに参加するのはいいですが...第二の...私はfechadasの合計だけを取得します。各仕事のための合計.. any ideiasはどうですか? – Roberto

1

サブクエリの代わりにジョインを使用します。 MySqlのパフォーマンスが大幅に向上します。

ALTER TABLE `job_cv` ADD INDEX `job_cv_cindex` (`job_cv_id` ASC, `jobs_id` ASC, `user_id` ASC); 
ALTER TABLE `job_cv_history` ADD INDEX `job_cv_history_cindex` (`job_cv_id` ASC, `status` ASC); 
2

あなたはこれらのインデックスを作成しようとするかもしれないかどうかを確認使用するようにしてください。実際には、外部クエリから返された各行に対してこれらのサブクエリを実行しています。代わりにこれらをジョインに移動し、パフォーマンスの向上を観察する必要があります。

+0

@Robertoこれらのインデックスを試しましたか? – Karolis

+0

ちょうど、同じ時間。インデックスがなぜ役立つのか説明できますか? – Roberto