2017-03-15 20 views
0

私はこのようなクエリがあります:私は、インデックスがSQLで動作しない方法がわからないですので、私は、PRIMARY KEYを除くすべてのインデックスを削除このMySQLクエリのインデックスをどのように最適化できますか?

CREATE TABLE `map` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `occupied` tinyint(2) NOT NULL DEFAULT '0', 
    `c_type` tinyint(4) NOT NULL DEFAULT '0', 
    `x` int(11) NOT NULL, 
    `y` int(11) NOT NULL, 
    `terrain` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4_general_ci 

SELECT id, terrain, occupied, c_type 
FROM map 
WHERE x >= $x-$radius 
    AND x <= $x+$radius 
    AND y >= $y-$radius 
    AND y <= $y+$radius 
    ORDER BY 
    x ASC, 
    y ASC 

を私のテーブルは次のようになります。 このクエリを調整するにはどうすればよいですか?ありがとう...

これは重複していません、コメントを確認してください!

+2

https://stackoverflow.com/questions/3567981/how-do-mysql-indexes-workを参照してください。 – SolarBear

+0

[MySQLインデックスはどのように動作しますか?](http://stackoverflow.com/questions/3567981/) how-do-mysql-indexes-work) – SolarBear

+1

指定したフィールドでWHERE文のデータベース検索データを使用しているとき。したがって、 'x'と 'y'にインデックスを追加することができます。 –

答えて

0

だから、私は列x, y, id, terrain, occupied, c_typeとインデックスgmpを追加し、SELECTディスプレイをEXPLAIN:

id: 1 

select_type: SIMPLE 

table: map 

type: range 

possible_keys: gmp 

key: gmp 

key_len: 8 

ref: NULL 

rows: 1955 

Extra: Using where; Using index 

だから、私はそれが機能するようになりましたね。

0

あなたはクエリがyにフィルタリングするための

WHERE x >= $x-$radius 
    AND x <= $x+$radius 

なくと有効となります

INDEX(x, y) -- In this order 

であることをでできる最善。

そして、(おそらく)ORDER BY x ASC, y ASCの「ファイル」を回避します。インデックスの順序は、この順序と一致する必要があります。

を試してみてください(SELECT)。

MyISAMが削除される前に、InnoDBに切り替えてください。

Hereは、MySQLでのインデックス作成のクイッククックブックです。

+0

私はインデックス 'GMP(X、Y、ID、地形、占有、c_typeを)'作成した、と私の上記のクエリにEXPLAIN実行すると key_lenに ID SELECT_TYPE テーブル タイプ possible_keys キーREF 行 エクストラ 1を示しています SIMPLE 地図範囲 GMP GMP 8 NULL 1955を使用します。インデックスを使用する –

+0

だから、私はそれが今の仕事だと思います。 –

関連する問題