我沒有MySQL的測試,但我很好奇它INTERSECT是多麼有效:
select points.*
from points
join
(
select id from points where x > 100 AND x < 200
intersect
select id from points where y > 100 AND y < 200
intersect
select id from points where z > 100 AND z < 200
) as keyset
on points.id = keyset.id
不一定,建議這一點 - 但它的一些嘗試,特別是如果你有X單獨的索引,y和z。
編輯:因爲mySQl不支持INTERSECT上面的查詢可以使用內聯視圖的JOINS重寫。每個視圖都將包含一個鍵集,每個視圖都會擁有放置在x,y和z上的單獨索引的優勢。性能取決於返回的鍵的數量以及相交/連接算法。
我首先測試了交叉方法(在SQLite中),以查看是否有方法在使用R-Tree模塊的情況下提高空間查詢的性能。 INTERSECT實際上比在其中一個空間值上使用單個非複合索引慢,然後掃描基表的子集以獲取其他空間值。但結果可能因數據庫的大小而異。在表達到龐大的大小和磁盤I/O作爲性能因素變得更加重要之後,將離散鍵集(其中每一個已經從索引實例化)交叉可能更有效,而不是掃描基本表子頻繁到索引的初始讀取。
來源
2011-02-11 21:56:10
Tim
您使用範圍查詢。索引是無用的。有時候,如果可以離散值並使用in運算符,就可以實現它。就像:'where x in(100,101,... 200)`這是一篇很好的文章來解釋這種差異 - http://explainextended.com/2009/10/07/in-list-vs-range-condition- mysql/ – 2011-02-11 21:39:35
看看nate c的鏈接,我的「解決方案」是不正確的。 – 2011-02-11 21:51:40