2015-01-15 28 views
1

可以使用空間索引來連接mysql中的表嗎?可以使用空間索引來連接mysql嗎?

我有兩個表,它有一個GEOMETRY列和一個空間索引。該表是MyISAM。 我想在交叉的行上加入這些表格。 儘管在我的查詢中使用了FORCE INDEX,但我無法讓mysql使用空間索引。

查詢是:

SELECT * 
FROM a FORCE INDEX FOR JOIN (asidx) 
JOIN b FORCE INDEX FOR JOIN (bsidx) 
    ON Intersects(a.g, b.g) -- g is the name of the GEOMETRY 

解釋計劃是:

 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra       | 
| 1 | SIMPLE  | a  | ALL | asidx   | NULL | NULL | NULL | 50000 |        | 
| 1 | SIMPLE  | b  | ALL | bsidx   | NULL | NULL | NULL | 50000 | Using where; Using join buffer | 

爲什麼不在索引使用? 對於50k行表,它運行15分鐘。 如何讓它更快?

回答

1

是的,空間索引可以用於連接,但是您沒有爲您的連接使用索引。

爲了使索引用於搜索,MySQL需要一個常量或者一個表達式來引用已經被讀取的數據列。

您沒有在ON子句中引用索引列。您引用01,這是INTERSECTS()函數的結果。

您的ON子句在聯接中的兩個表的列上指定一個函數。直到兩個記錄都已被讀取,MySQL纔會有該函數所需的列值,所以沒有索引可用於連接,需要全面掃描。

基本上,MySQL不知道兩個記錄是否合在一起,直到它嘗試它,所以它必須嘗試每個組合。

也許更好的解決方案是預先計算一個交叉點對的表,將它們存儲在一個單獨的(聯結)表中,然後以這種方式加入。

+0

因爲我需要相交記錄,所以沒有什麼可以預先計算的。只有交點的計算。你是否說沒有辦法加快速度? – Amnon

相關問題