我有大約100億行的座標爲(x double, y double, z double)
的點在MySQL表中。我在x
,y
和z
這兩列創建了索引索引,這樣按範圍過濾就很好並且很快捷。爲什麼這個查詢在某些範圍的數據上變慢,而在另一些範圍內變快?
查詢模板:(在{}
東西與實際值替換)
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似乎更喜歡它,而這樣做範圍過濾器,也查詢需要持續的時間更少。
請顯示執行計劃。 MySQL可能不會使用多於一個索引,並且數據傾斜可能是不幸的。你可以分別在三個維度中分別列出計數(',其中x在1-5和1 + 5之間,等等)。 – Thilo 2014-11-03 07:36:19
除了執行計劃和統計數據 - 表格模式 – zerkms 2014-11-03 08:00:52
@Thilo向問題 – Optimus 2014-11-03 08:04:44