2017-12-06 16 views
0

私は基本的に同じ2つのステートメントを持っています。しかし、1つは55秒、もう1つは2秒かかります。どうして?ここで2つの同一のMySQL質問に異なる実行計画があり、時間が大きく異なるのはなぜですか?

が正常に動作しますクエリです:

SELECT 
    employees.EmployeeID 
FROM 
    employees 
LEFT JOIN req_budget_centers ON employees.BudgetCenter = req_budget_centers.BudgetCenter 
INNER JOIN req_bcjc ON employees.BudgetCenter = req_bcjc.BudgetCenter AND employees.JobCode = req_bcjc.JobCode AND employees.EmpContr = req_bcjc.EmpContr 
INNER JOIN j_bcjc_req ON req_bcjc.bcjcID = j_bcjc_req.bcjcID 
INNER JOIN req_requirements ON j_bcjc_req.requirementID = req_requirements.id 
WHERE 
    req_requirements.BoardCategoryID = 4 /*PROBLEM VALUE*/ 
    AND req_requirements.isActive = 1 
    AND employees.`Status` = 'A' 

はここ50+秒かかりクエリのコードです: enter image description here

:ここ

SELECT 
    employees.EmployeeID 
FROM 
    employees 
LEFT JOIN req_budget_centers ON employees.BudgetCenter = req_budget_centers.BudgetCenter 
INNER JOIN req_bcjc ON employees.BudgetCenter = req_bcjc.BudgetCenter AND employees.JobCode = req_bcjc.JobCode AND employees.EmpContr = req_bcjc.EmpContr 
INNER JOIN j_bcjc_req ON req_bcjc.bcjcID = j_bcjc_req.bcjcID 
INNER JOIN req_requirements ON j_bcjc_req.requirementID = req_requirements.id 
WHERE 
    req_requirements.BoardCategoryID = 8 /* WORKS FINE */ 
    AND req_requirements.isActive = 1 
    AND employees.`Status` = 'A' 

は、これらの2つのクエリの実行計画があります

値が8の場合と異なるテーブルには何もありません.4つの場合...関連する全体のレコード数i同じもの...ここでボトルネックをどうやって見つけますか?

私も完全に(= 8または= 4)の条件を残すが、すべて、で合流かなり同様のクエリをスピードアップ...

+0

多分、1つのクエリのバッファーがオーバーフローして実行速度が大幅に遅くなる可能性があります。あなたのMySQLサーバがうまくチューニングされていない可能性があります。 – tadman

+0

@tadman「より高いカーディナリティ」と「バッファオーバーフロー」は私の頭の上で非常に高く飛んでいました。私は、サーバー上で実行されているものは何もないと言いたいのですが、サーバー上のユーザーはほとんどいないでしょう。私がジャンプする唯一のことは、従業員テーブルの "key_len"です...なぜ、使用されるキーが2つのクエリで異なっているのか、そしてなぜ1つが768であるのか理解できません... 768とは何ですか?それはずっと長い? –

+0

「カーディナリティ」は、「インデックスをナビゲートしたり、JOIN操作を実行するときにMySQLが考慮する必要がある行の数」を意味する用語です。言い換えれば、2番目のクエリにさらに多くのデータが含まれていると、MySQLはRAMにすべてを保持するための十分なメモリがなく、ディスクへページアウトする必要があります(一時テーブルを使用する)。 – tadman

答えて

-1

私は、パラメータを渡すことをお勧め去ることを追加します値4と8のタイミングを確認してください。

例:パラメータを渡す方法。 @type = 'foo'を設定します。

select * from Stuff where type = @ type;

+0

「パラメータを渡す」という意味を説明できますか? –

関連する問題