2011-08-30 65 views
3

我有一個包含街道地址列的位置表。我的應用程序提供了一個搜索機制,用於查詢具有此列的位置,並試圖加快查詢速度。這個db有超過200萬條記錄,我只是想我會提出這個問題來看看人們做了什麼。我確定我不是第一個。我的問題基本上是這樣:給定一個主鍵,地址,城市,州,郵編列,如何把這個表進行索引,像查詢下面沒有需要10秒:如何爲街道地址列編制索引

`select * from location where loc_address_s like '%blvd%'` 
`select * from location where loc_address_s like 'oak' AND loc_city like 'salem'` 

等..

+1

如果您使用的是SQL Server,請考慮在loc_address_s上實現全文索引。這可能會做你想要的。 –

+0

最佳選擇是將街道地址分成多個字段。建築#,街道名稱,街道類型,方向等...每個都可以單獨索引。 –

回答

3

你最好的選擇,如果它是在所有可能的,是向下突破的地址到其組件。這就是美國郵局如何存儲地址以及許多(大多數)大型地址處理公司和代理機構。數據庫設計的最佳實踐通常包括沒有一列容納多行數據。現在你存儲一個門牌號,街道方向(N爲「北大街」爲例),街道名稱,街道類型等

一旦你擁有了一切爆發正常,你可以索引單個列,如果你需要這樣做。

我敢肯定,有一個標準在那裏(快速搜索ansi.org網站並沒有給我任何東西雖然)。存儲地址是必須要做的事情。

此外,您還可以找到許多地址清理服務和軟件,地址分解成這些列,如果你不想去通過努力完全靠自己了。

3

索引無法幫助包含謂詞的LIKE謂詞的查詢 - 它必須執行全表/聚簇索引掃描。

一般來說,解決諸如這些問題,是全文索引。有關信息,請參閱this documentation

但是,我實現了自定義的斷詞,然後在過去使用常規指標成功過 - 地址數據。將地址拆分成單詞/標記並將每個唯一標記存儲在Token表中。然後有一個Address表,其中包含每個地址和您想要的任何其他元數據的唯一標識符。最後,一個AddressToken表,它具有每個先前表的外鍵和每個地址中每個令牌的一行。您可能需要對此方法進行非規範化(可能通過索引通道)以獲得更好的性能。

+1

它可以使用索引,但會使用索引掃描而不是索引查找。參考:http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx –

+0

實際上,索引可以提供幫助,掃描單個列索引比掃描聚集索引需要的磁盤讀取少得多 – Andomar

+2

@Andomar OP需要'SELECT *',因此如果匹配行數很大,表掃描或聚簇索引掃描可能比使用書籤查找的非聚簇索引掃描更好。 –

相關問題