2

MySQLクエリがあります:

   SELECT DISTINCT 
          c.id, 
          c.company_name, 
          cd.firstname, 
          cd.surname, 
          cis.description AS industry_sector 
     FROM (clients c) 
     JOIN clients_details cd ON c.id = cd.client_id 
LEFT JOIN clients_industry_sectors cis ON cd.industry_sector_id = cis.id 
    WHERE c.record_type='virgin'
 ORDER BY date_action, company_name asc, id desc 
    LIMIT 30

クライアントテーブルには約60〜70k行があり、「id」、「record_type」、「date_action」、「company_name」のインデックスがあります。残念ながら、クエリの完了には5秒以上かかります。'ORDER BY'を削除すると、ファイルソートが不要になるため、これは約30ミリ秒に短縮されます。このクエリを変更して5秒以上の応答時間を改善する方法はありますか?

4

4 に答える 4

2

参照:http ://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

特に:

場合によっては、MySQLはインデックスを使用してORDER BY(..)を解決できないことがあります。これらのケースには、次のものが含まれます。
(..)
多くのテーブルを結合しており、ORDER BYの列は、行の取得に使用される最初の非定数テーブルのすべてではありません。(これは、const結合タイプを持たないEXPLAIN出力の最初のテーブルです。)

于 2010-10-15T15:39:09.017 に答える
0

のインデックスがありますid, record_type, date_action。ただし、で並べ替える場合は、インデックスの最初のフィールドとして、できれば並べ替えの正確なフィールドと一致するdate_actionインデックスが本当に必要です。date_actionそうでなければ、それは遅いクエリになります。

于 2010-10-15T15:28:06.623 に答える
0

すべてのテーブルとインデックスを確認しないと、わかりにくいです。クエリの高速化について質問する場合、クエリは方程式の一部にすぎません。

  • clientsにインデックスがありidますか?
  • にインデックスclientsがありますrecord_type
  • clients_detailsにインデックスがありclient_idますか?
  • clients_industry_sectorsにインデックスがありidますか?

これらは、このクエリが迅速に機能するために必要な最小限のものです。

于 2010-10-15T15:28:56.803 に答える
0

入力と提案をどうもありがとう。最終的に、この目的のために結果を返すことを唯一の目的とする新しいDBテーブルを作成することにしました。そのため、結合は必要ありません。マスタークライアントテーブルとの間でレコードが追加または削除されたときにテーブルを更新するだけです。 。データストレージの観点からは理想的ではありませんが、問題を解決し、非常に高速に結果を得ることができます。:)

于 2010-10-19T10:33:07.207 に答える