2

現在データベースにあるデータで実行速度が非常に遅い(数分)クエリがいくつかありますが、それらのパフォーマンスを向上させたいと考えています。残念ながら、それらはちょっと複雑なので、グーグル経由で取得する情報は、追加するインデックスや、クエリを書き直す必要があるかどうか、または何をする必要があるかを理解するのに十分ではありません...誰かが助けてくれることを願っています。適切に設定されていれば、これほど遅くなることはないと思います。

最初のクエリは次のとおりです。

SELECT i.name, i.id, COUNT(c.id) 
FROM cert_certificates c 
JOIN cert_histories h ON h.cert_certificate_id = c.id 
LEFT OUTER JOIN inspectors i ON h.inspector_id = i.id
LEFT OUTER JOIN cert_histories h2 
  ON (h2.cert_certificate_id = c.id AND h.date_changed < h2.date_changed)
WHERE (h.cert_status_ref_id = ? OR h.cert_status_ref_id = ?) 
  AND h2.id IS NULL
GROUP BY i.id, i.name
ORDER BY i.name

2番目のクエリは次のとおりです。

SELECT l.letter, c.number
FROM cert_certificates c 
JOIN cert_type_letter_refs l ON c.cert_type_letter_ref_id = l.id
JOIN cert_histories h ON h.cert_certificate_id = c.id
LEFT OUTER JOIN cert_histories h2 
  ON (h2.cert_certificate_id = c.id AND h.date_changed < h2.date_changed)
WHERE h.cert_status_ref_id = ? 
  AND h2.id IS NULL 
  AND h.inspector_id = ?
ORDER BY l.letter, c.number

cert_certificatesテーブルには、cert_historiesテーブルと同様に約19kのレコードが含まれています(ただし、将来的には、このテーブルはcert_certificatesテーブルのサイズの約2〜3倍になると予想されます)。他のテーブルはすべて非常に小さいです。それぞれ10レコード未満。

現在のところ、インデックスは各テーブルのidとcert_certificates.numberにあります。外部キーのインデックスを追加するためにいくつかの場所(たとえばここ)を読みましたが、cert_historiesテーブルの場合、ほぼすべての列(cert_certificate_id、inspector_id、cert_status_ref_id)であり、これもお勧めできません(一部の人によると)その質問に対する答えの例:Markus Winand's)なので、私はちょっと迷っています。

どんな助けでも大歓迎です。

ETA:最初のクエリでのEXPLAINの結果は次のとおりです(恐ろしいフォーマットで申し訳ありません。SQLyogを使用して素敵なテーブルに表示していますが、StackOverflowはテーブルをサポートしていないようです?):

idselect_typeテーブルタイプpossible_keyskeykey_len ref rows Extra
1 SIMPLE h ALL NULL NULL NULLNULL19740使用場所; 一時的な使用; filesortの使用
1 SIMPLE i ref index_inspectors_on_id index_inspectors_on_id 768marketing_development.h.inspector_id 1   
1 SIMPLE c ref index_cert_certificates_on_id index_cert_certificates_on_id768marketing_development.h.cert_certificate_id91使用場所; インデックスの使用
1 SIMPLE h2 ALL NULL NULL NULL NULL 19740

2番目のクエリ:

idselect_typeテーブルタイプpossible_keyskeykey_len ref rows Extra
1 SIMPLE h ALL NULL NULL NULLNULL19795使用場所; 一時的な使用; filesortの使用
1 SIMPLE c ref index_cert_certificates_on_id index_cert_certificates_on_id768marketing_development.h.cert_certificate_id91ここでの使用
1 SIMPLE l ALL index_cert_type_letter_refs_on_id NULL NULL NULL5whereを使用します。結合バッファの使用
1 SIMPLE h2 ALL NULL NULL NULLNULL19795ここでの使用
4

1 に答える 1

1

結合フィールドにインデックスを作成する必要があります。

cert_certificates.cert_type_letter_ref_id
cert_histories.cert_certificate_id
cert_histories.date_changed
cert_histories.inspector_id
于 2012-10-29T18:11:16.980 に答える