2010-01-20 33 views
0

我很難有效地解決以下問題SQL:如何從大型連續矩陣中選擇矩形範圍內的元素? **更新**

我有一個15000x15000 xy矩陣。我通過定義元素的x,y座標來存儲矩陣中的元素位置。我想在所謂的視口中顯示矩陣的一部分。視區尺寸例如是1600x1000

考慮以下數據庫結構:

Element (element_id, image, width, height)
Globe_Element (ge_id, x, y, element_id)

擁有國內唯一input是斧子,Y的網格(500×500),我如何可以選擇所有somehwere座標Globe_Element在視口中可見的行(6x4)?

Viewport example http://img33.imageshack.us/img33/6089/viewportexample.jpg

上述圖像演示了問題。小的橙色方塊是應該包含的元素,小紅色方塊不應該(看最近的視口)。灰色圓圈定義輸入座標

回答

1

這樣做有效的SQL我會建議你選擇與空間支持(通常是名GIS支持下會)或支持二維或多維索引的DBMS(我不知道任何這樣)。

我覺得只有這樣,你可以讓你的查詢使用索引來有效地執行。

Postgres有空間支持(名稱PostGIS下)一樣,MS SQL 2008和Oracle。我只使用MS SQL 2008空間,here is a nice overview of how its spatial index subdivides the surface

沒有多維度的指標,你會在磁盤上沿一個座標軸訂購的對象,因此你只能縮小爲僅沿一個座標軸對象的表掃描。


如果您希望繼續使用MySQL的(回覆如下OP評論):

我覺得這是更好地創建具有具體值查詢 - 不管你做,在PHP或存儲過程在SQL方面,是一個不同的問題。但是在PHP中這麼做很簡單和容易,所以我會推薦。

您可以決定視口是否處於非環繞位置(上圖中的藍色),然後足以使用簡單的WHERE xmin>=viewport_xmin AND xmax<=viewport_xmax AND ymin>=viewport_ymin AND ymax<=viewport_ymax子句發出單個查詢。或者看到視包裝,然後嘗試無論是更快地執行2/4分離簡單查詢每個門戶的2/4展開部分,或者把所有的2/4簡單的查詢與它們之間OR小號一個大的問題。你將不得不看看哪一個會更快,實驗索引,查看查詢計劃等。

+0

不錯,至於尋找一個解決方案...有沒有辦法查詢這個使用1座標作爲mysql(4)中的輸入參數?或者它可以更有效地計算在PHP中的東西,並加載SQL查詢與where語句? – Ropstah 2010-01-20 20:43:06

+0

@ropstah:回覆添加到我的答案。 – 2010-01-20 21:21:37

+0

非常好的答案,謝謝。我一直在模數運算器的實驗。你能在這種情況下看到運營商的正確用法嗎? – Ropstah 2010-01-20 21:41:05

1

假設您的座標參數是左上角視口的,像這樣通常是如何選擇相應的行:

SELECT * FROM globe_element克,元素e

其中

e.element_id = g.element_id和

((X <寬度和@x_param和(@x_param + 6)) 或之間X(X> -1和x(@x_param之間 - 寬度)和(@x_param - 寬度+ 6)))

((y_loc <高度和@y_param和(@y_param + 4))或之間y_loc(y_loc> -1和(@y_param之間y_loc - 高度)和(@y_param - 高度+ 4)) )

這只是泛型sql,而不是mysql特定的(參數,至少)。

一般:選擇x在x_param和x_param + view_port_width之間,y在y_param和y + param + view_port_height之間。如果計算的座標大於view_port_width/height,則減去500以獲得相應的包裝位置。

這不以任何方式排序座標。

另外,你的「球形」環境看起來並不是球形......你如何將一個網格映射到一個球體?就像地球上的緯度/緯度一樣,每個平方單位的面積在你到達極點時會縮小?如果是這樣的話,那麼這將起作用。如果沒有,那麼我發佈的內容就是垃圾。但是,如果是這種情況,那麼在SQL中解決這個問題也是錯誤的。

+0

(這些區域縮小,你是對的)。但它不能正常工作,因爲它不考慮「全球」維度。如果X參數是498,那麼將如何選擇0到3之間的X的globe_elements? – Ropstah 2010-01-20 16:25:28

+0

請在我的更新的問題中找到圖像... – Ropstah 2010-01-20 16:47:27