私は基本的に同じ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'
:ここ
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)の条件を残すが、すべて、で合流かなり同様のクエリをスピードアップ...
多分、1つのクエリのバッファーがオーバーフローして実行速度が大幅に遅くなる可能性があります。あなたのMySQLサーバがうまくチューニングされていない可能性があります。 – tadman
@tadman「より高いカーディナリティ」と「バッファオーバーフロー」は私の頭の上で非常に高く飛んでいました。私は、サーバー上で実行されているものは何もないと言いたいのですが、サーバー上のユーザーはほとんどいないでしょう。私がジャンプする唯一のことは、従業員テーブルの "key_len"です...なぜ、使用されるキーが2つのクエリで異なっているのか、そしてなぜ1つが768であるのか理解できません... 768とは何ですか?それはずっと長い? –
「カーディナリティ」は、「インデックスをナビゲートしたり、JOIN操作を実行するときにMySQLが考慮する必要がある行の数」を意味する用語です。言い換えれば、2番目のクエリにさらに多くのデータが含まれていると、MySQLはRAMにすべてを保持するための十分なメモリがなく、ディスクへページアウトする必要があります(一時テーブルを使用する)。 – tadman