2017-03-15 67 views
0

我有這樣的查詢:如何索引 - 優化這個MySQL查詢?

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 

我的表看起來像這樣:

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 

我刪除了所有指數除PRIMARY KEY,因爲我不確定如何索引原理與SQL。 我能做些什麼來調整這個查詢?謝謝...

這不是重複的,檢查評論!

+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和EXPLAIN SELECT顯示:

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

你可以查詢做的最好的是

INDEX(x, y) -- In this order 

這將是有效的與

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

但不適合在y過濾。

它將(可能)避免ORDER BY x ASC, y ASC的「filesort」。請注意,索引順序必須與此順序匹配。

提供EXPLAIN SELECT ...任何企圖SELECT

並且,在MyISAM被移除之前請切換到InnoDB。

Here是一本關於MySQL索引的快速手冊。

+0

我創建的索引'GMP(X,Y,ID,地形,佔用,c_type)'和運行EXPLAIN在我上面的查詢顯示ID SELECT_TYPE 表 型 possible_keys 關鍵 key_len 裁判 行 額外 SIMPLE 地圖 範圍 GMP GMP NULL 1955年 使用 其中;使用索引 –

+0

所以,我猜這是現在的作品。 –