0

私は非常に遅いこのMySQLクエリを持っています.すべてのJOINが原因だと思います(複雑に見えますが、多くのテーブルの問題です):

SELECT DISTINCT doctors.doc_id, 
    doctors.doc_user, 
    doctors.doc_first, 
    doctors.doc_last, 
    doctors.doc_email, 
    doctors.doc_notes, 
    titles.tit_name, 
    specializations.spe_name, 
    activities.act_name, 
    users.use_first, 
    users.use_last,
    (SELECT COUNT(*) FROM locations WHERE locations.loc_doctor = doctors.doc_id) AS loc_count,
    (SELECT COUNT(*) FROM reception WHERE reception.rec_doctor = doctors.doc_id) AS rec_count,
    (SELECT COUNT(*) FROM visits INNER JOIN reports ON visits.vis_report = reports.rep_id  WHERE visits.vis_doctor = doctors.doc_id AND reports.rep_user LIKE '%s') AS vis_count
FROM
    doctors
INNER JOIN titles ON titles.tit_id = doctors.doc_title
INNER JOIN specializations ON specializations.spe_id = doctors.doc_specialization
INNER JOIN activities ON activities.act_id = doctors.doc_activity
LEFT JOIN locations ON locations.loc_doctor = doctors.doc_id
INNER JOIN users ON doctors.doc_user = users.use_id
WHERE
    ((doctors.doc_last LIKE %s) OR (doctors.doc_first LIKE %s) OR (doctors.doc_email LIKE %s)) 
    AND doctors.doc_user LIKE %s 
    AND locations.loc_province LIKE %s 
    AND doctors.doc_specialization LIKE %s 
    AND doctors.doc_activity LIKE %s 
ORDER BY %s

すべての %s は sprintf() PHP 関数
のパラメーターです 最も重要なことは、MySQL にインデックスがないことです! いくつかのインデックスを追加するプロセスをスピードアップできると思います...しかし、何をどこに?非常に多くの結合と検索パラメーターがあり、何が効率的かについて混乱しています:-)

助けてください。前もって感謝します!

4

2 に答える 2

0

where条件で使用している列にインデックスを追加することから始めることができます。

さらに、結合で使用されるフィールド、つまり主キーと外部キーの列にインデックスを付ける必要があります。

これらのインデックスを徐々に試してみると、実際のパフォーマンスが向上することをお勧めします。

さらに、1 回のクエリで取得するデータが多すぎることがわかりました。本当に必要ない場合は、(可能であれば) 別のレポートやページに分割してください。適切なインデックス作成を行ったとしても、ソリューションはあまりスケーラブルではなく、大量のデータを処理できない可能性があります。

注: '%' 修飾子で照会するフィールドに全文索引を作成する必要がある場合があります (つまり、LIKE 演算子を使用します)。

于 2012-10-05T10:49:03.173 に答える
0

同様の演算子はかなり遅いです。ここでは、インデックスと FULL TEXT の適用について説明します

mysql のようなパフォーマンスの向上

于 2012-10-05T10:50:47.573 に答える