2016-09-30 5 views
-1

私は500k行のテーブルを持っています。私はすべてのクエリを実行するのに本当に時間がかかる特定のテーブルを持っています。MySQLクエリのパフォーマンスが遅い

クエリの一つは:

SELECT * 
FROM player_data 
WHERE `user_id` = '61120' 
    AND `opzak` = 'ja' 
ORDER BY opzak_nummer ASC 

opzak_nummer列番号とtinyintあります。

はEXPLAIN:

enter image description here

は、このクエリのパフォーマンスと、このクエリ/テーブルの一般性を改善する方法はありますか?

テーブル名はplayer_dataで、約25個の列が含まれています。それらのほとんどはstatsの値を持つ整数です。

インデックスはid AUTO_INCREMENTです。

+0

あなたはどのインデックスを使用していることです詳細を読むことができます。 – khalid

+0

パフォーマンスに関する質問には、EXPLAIN ANALYZEと、テーブルサイズ、インデックス、現在の時間パフォーマンス、欲求時間などに関する情報が含まれている必要があります。スローは相対的な用語であり、比較するには実際の値が必要です。また、[How-to-Ask](http://stackoverflow.com/help/how-to-ask)を参照してください。 – e4c5

+0

SELECT * FROM player_data WHERE 'user_id' = '61120' AND' opzak' = 'ja' ORDER BY opzak_nummer ASC – khalid

答えて

1

このクエリを実行する必要があります。テーブルを変更してインデックスを追加します。あなたはここにhttp://dev.mysql.com/doc/refman/5.7/en/drop-index.html

ALTER TABLE pokemon_speler ADD INDEX index_name (user_id, opzak);

+0

を参照してください、まだいくつかの問題があります。議論の中で教えてください – TheUnreal

0

そのクエリの最適な指標は、これらのいずれかである:

INDEX(user_id, opzak, opzak_nummer) 
INDEX(opzak, user_id, opzak_nummer) 

最初の2列は、フィルタリングを行います。最後はtmpテーブルを避け、ORDER BYを消費して並べ替えます。

「ユニーク」の列の組み合わせ(id以外)はありますか?もしそうなら、私たちはもっと速く走らせることができるかもしれません。

+0

'idは唯一のユニークです。あなたの答えの最初の部分、 'INDEX(user_id、opzak、opzak_nummer)INDEX(opzak、user_id、opzak_nummer)'とtmpテーブルを避けるにはどうしたらいいですか? – TheUnreal

+0

どちらのインデックスでも、_that_クエリーのtmpテーブルは避けてください。 [_Cookbook_](https://mariadb.com/kb/en/mariadb/building-the-best-index-for-a-given-select/) –