我用修改前序樹存儲在我的一個表LOC_TABLE應用GEO位置。例如子樹的例子希臘看起來是這樣的:修改序樹:選擇特定類型的頂級元素
+-------+---------------+-----+-----+------+
| ID | NAME | LFT | RGT | TYPE |
+-------+---------------+-----+-----+------+
| 10 | Greece | 100 | 200 | 3 |
| 20 | Crete Isl. | 120 | 140 | 4 |
| 25 | Crete-Vamos | 121 | 122 | 4 |
| 26 | Crete-Rethymno| 123 | 124 | 4 |
....
+-------+---------------+-----+-----+------+
TYPE
列用於存儲類型定位(3 - 國家,4 - 市)。正如您所看到的,克里特島被存儲爲城市,其中包含其他城市(例如,Vamos
和Rethymno
)作爲其子。
我需要進行兩種類型的查詢:
1)獲取在特定父特定類型的所有位置。
2)獲取在特定父特定類型的所有頂部位置:對於僅Crete Isl.
應查詢內部希臘城市時,返回地點提供的例子,因爲Crete Isl.
沒有型城市的父母,而城市Vamos
和Rethymno
有型城市的母公司 - Crete Isl.
什麼在每種情況下進行快速查詢?對於第一種情況,我考慮使用兩個查詢(首先,獲得希臘的LFT和RGT,第二個獲取類型= 4的所有位置,其具有適當的LFT和RGT)或使用某種連接來獲得所有一步到位。哪種方法最好?
對於第二種情況,我沒有任何當前合適的想法。我嘗試了簡單的子選擇:
select loc.* from LOC_TABLE loc
where 4 not in
(select TYPE from LOC_TABLE p
where p.lft < loc.lft AND p.rgt > loc.rgt)
AND loc.LFT > 100 AND loc.RGT < 200;
但它太長了。
我不介意增加更多的專欄,並與一些值,這將有助於加快這兩種類型的查詢填充它們。但我需要快速獲取數據。
謝謝。
第一個查詢有效,但需要大約1.5秒才能獲取位置。當執行兩個步驟的查詢時:爲父代提取LFT和RGT的時間少於0.01秒,使用LFT> parent.LFT和RGT
第二個查詢也可以工作,但需要3-6秒。我們能否更快地獲得地點?我不介意添加一些緩存值的列以使其更快。 –
首先,確保你有'ID','LFT'和'RGT'的指示。如果你有,對於第一個查詢,從移動的條件'WHERE'條款到'ON'條款可以幫助(雖然它surpises我的MySQL優化器不這樣做的話)。 – Oswald