1

2つのテーブルがあります。1つはIDを評価に一致させ、もう1つはIDを約15列の実際のデータに一致させます。データテーブルでは、id列にインデックスがあり、評価テーブルでは、idが主キーであり、評価にインデックスが付けられています。データを選択したいのですが、評価が正の行からのみです。そうするために私はクエリを使用しています

SELECT * FROM data_table 
  INNER JOIN rating_table ON data_table.id = rating_table.id
  WHERE rating > 0

しかし、何らかの理由で、これには約0.35秒かかります。これは、私には非常に長いようです。データテーブルには約90,000行、評価テーブルには約5,000行あり、これには10分の1秒もかからない必要があります...このタスクを高速化するために、インデックスを変更したり、クエリを変更したりするにはどうすればよいですか。

編集: プロファイリングした後、それは私に次のことを与えました。キャッシュされたので、クエリが以前よりもはるかに速く戻ってきたと思いますが、それでもこれは誰かに役立つ可能性があることに注意してください

0.000012 starting   
0.000053 checking query cache for query     
0.000014 Opening tables     
0.000006 System lock    
0.000027 Table lock     
0.000044 init   
0.000018 optimizing     
0.000060 statistics     
0.000016 preparing  
0.000004 executing  
0.004916 Sending data   
0.000007 end    
0.000003 query end  
0.002271 freeing items  
0.000009 storing result in query cache  
0.000002 logging slow query     
0.000004 cleaning up    

だから私はデータの送信に多くの時間が費やされたのを見る...どうすればこの部分をスピードアップできますか?

4

1 に答える 1

3

問題の正確な解決策はありませんが、実際のテーブル構造を確認せずにアドバイスをいくつか:クエリを適切にプロファイルします。

MySQL には組み込みのプロファイラーがあり、クエリのどの部分にどれだけの時間が費やされたかを非常に詳細に確認できます。

あなたの場合、次の手順に従ってください。

(1) クエリを実行します。

(2) プロファイリング用のクエリ ID を調べます。

SHOW PROFILES;

次のようなものが返されます。

Query_ID |  Duration | Query
---------+-----------+-----------------------
   2     | 0.0006200 | SHOW STATUS
   3     | 0.3600000 | (your query here)
  ...    | ...       | ...

これで、クエリ ID が (3) であることがわかりました。

(3) クエリをプロファイリングします。

SHOW PROFILE FOR QUERY 3;   // example 

これにより、次のような詳細が返されます。

Status                          | Duration
--------------------------------+-------------------
starting                        | 0.000010
checking query cache for query  | 0.000078
Opening tables                  | 0.000051
System lock                     | 0.000003
Table lock                      | 0.000008
init                            | 0.000036
optimizing                      | 0.000020
statistics                      | 0.000013
preparing                       | 0.000015
Creating tmp table              | 0.000028
executing                       | 0.000602
Copying to tmp table            | 0.000176
Sorting result                  | 0.000043
Sending data                    | 0.080032
end                             | 0.000004
removing tmp table              | 0.000024
end                             | 0.000006
query end                       | 0.000003
freeing items                   | 0.000148
removing tmp table              | 0.000019
closing tables                  | 0.000005
logging slow query              | 0.000003
cleaning up                     | 0.000004

この例では、ほとんどの時間がサーバーからクライアントにデータを送信するのに実際に費やされました。

これを行った場合は、質問を更新して結果を表示してください。また、データ構造も追加するかもしれません。

于 2012-06-28T06:44:49.307 に答える