2014-11-03 110 views
0

我有大約100億行的座標爲(x double, y double, z double)的點在MySQL表中。我在xyz這兩列創建了索引索引,這樣按範圍過濾就很好並且很快捷。爲什麼這個查詢在某些範圍的數據上變慢,而在另一些範圍內變快?

查詢模板:(在{}東西與實際值替換)

select id from points_table where 
    x between {x-5} and {x+5} and 
    y between {y-5} and {y+5} and 
    z between {z-5} and {z+5}; 

現在,奇怪的是這個查詢一貫大約需要一些點0.05秒,並顯着大〜1.5秒他人即使返回的結果數量大致相同。

其中一個例子是,

(x,y,z) = (1,5,-6)查詢時間〜0.04秒,並獲取45個結果,但是,

(x,y,z) = (-2,0,3)查詢時間〜1.20秒,並獲取38個結果

這似乎很奇怪對我來說。什麼可能是這種行爲的原因?

編輯:由於這裏要求對兩個查詢我們解釋,

explain select id from points_table where x between 1-5 and 1+5 and y between 5-5 and 5+5 and z between -6-5 and -6+5; 
+----+-------------+--------------+-------+-------------------+-------+---------+------+-------+-----------------------------------------------+ 
| id | select_type | tab   | type | possible_keys  | key | key_len | ref | rows | Extra           | 
+----+-------------+--------------+-------+-------------------+-------+---------+------+-------+-----------------------------------------------+ 
| 1 | SIMPLE  | points_table | range | pnt_x,pnt_y,pnt_z | pnt_y | 9  | NULL | 18748 | Using index condition; Using where; Using MRR | 
+----+-------------+--------------+-------+-------------------+-------+---------+------+-------+-----------------------------------------------+ 


explain select id from points_table where x between -2-5 and -2+5 and y between 0-5 and 0+5 and z between 3-5 and 3+5; 
+----+-------------+--------------+-------+-------------------+-------+---------+------+--------+-----------------------------------------------+ 
| id | select_type | tab   | type | possible_keys  | key | key_len | ref | rows | Extra           | 
+----+-------------+--------------+-------+-------------------+-------+---------+------+--------+-----------------------------------------------+ 
| 1 | SIMPLE  | points_table | range | pnt_x,pnt_y,pnt_z | pnt_y | 9  | NULL | 235748 | Using index condition; Using where; Using MRR | 
+----+-------------+--------------+-------+-------------------+-------+---------+------+--------+-----------------------------------------------+ 

我想只有指數y正在被使用,也有中行的數量相差很多,這可以解釋的時間差距。

但現在我的問題是,

我怎麼MySQL使用的所有索引?他們在那裏是有原因的。

編輯:

所以我創建了一個複合鍵(X,Y,Z)和MySQL似乎更喜歡它,而這樣做範圍過濾器,也查詢需要持續的時間更少。

+2

請顯示執行計劃。 MySQL可能不會使用多於一個索引,並且數據傾斜可能是不幸的。你可以分別在三個維度中分別列出計數(',其中x在1-5和1 + 5之間,等等)。 – Thilo 2014-11-03 07:36:19

+0

除了執行計劃和統計數據 - 表格模式 – zerkms 2014-11-03 08:00:52

+0

@Thilo向問題 – Optimus 2014-11-03 08:04:44

回答

2

查詢計劃會告訴您哪個索引真的被使用 - 但出於討論的目的,我們假設總是使用Y.

你很可能看到類似的到指數X選擇18748行和X和Z範圍過濾掉所有,但45行,但對於第2個查詢索引X選擇235748行和X和Z範圍篩選結果的情況到38行。

相同的查詢,相同的執行計劃不計算I/O數量,但在第二個查詢中正在處理更多的數據,以獲得總行數相似的結果。

更新此答案與實際查詢計劃信息所建議的zerkms。

+1

如果您不在網頁上,只需要ping一下:OP已更新問題,因此可以用實際的數字更新答案:-) – zerkms 2014-11-03 08:06:27

相關問題