2010-05-25 126 views

回答

4

我不會直接處理說明列 - 關於選擇的每行功能很少能很好地擴展。我訂閱的準則之一是不需要在列內處理東西(類似於您的案例中的描述,或逗號分隔變量列的部分或甚至名稱(第一/最後)和地址(街道/城鎮/州) 組件)。如果你這樣做,通常是更有效的方法。

我會做的是在表上插入,更新和刪除觸發器。對於插入/更新觸發器,我會填充沿着DescLookup下面幾行另一個表:

Movies: 
    Id primary key 
    Title 
    Description 
DescLookup: 
    Word 
    MovieId foreign key Movies(Id) 
    Count 
    primary key (Word,MovieId) 
    index (MovieId) 

基本上,在描述(每個非干擾詞即打折之類的東西andorby,標點符號,單字母單詞等),您會在此表中獲得一個條目(使用較低的單詞)。

確保觸發器在重新填充之前刪除該MovieId的所有當前行,以免留下不正確的信息。

然後您使用該表來運行您的查詢。這會將查找單詞的「成本」移動到插入/更新中,而不是每一次選擇,都會大大降低成本。這很有效,因爲大部分數據庫的讀取次數遠遠多於寫入次數,所以將成本轉移到寫入部分是個不錯的主意。

請記住,爲此需要額外的存儲空間,但如果您檢查人們對數據庫詢問的大量問題,「我該如何快速執行此操作?」遠遠超過「我如何使用更少的磁盤空間?」。

而刪除觸發器將簡單地刪除DescLookup表中的所有條目以及相關的MovieId

因爲Word列索引(還有如你的要求,你會不會搜索每一個描述字段),它的搜索將是快如閃電。這是因爲:

select MovieId from DescLookup where Word = 'nature'; 

會吹:

select Id from Movies where lower(Description) like '%nature%'; 

出來的水。

+0

這是一個非常酷的方法,但我猜OP已經有他的表填充。你能否建議一種方法讓他從他現在的東西中產生起始數據集? – Drew 2010-05-25 04:59:29

+0

是的,創建輔助表,設置插入/更新觸發器,然後執行:'更新電影設置desc = desc;'。這應該激發數據庫中每一行的觸發器。如果你的數據庫管理系統是如此聰明(或者鬼鬼祟祟的,IMNSHO),以至於不能認識到這是一個真正的更新,只需要:'更新電影集desc =''|| desc;更新電影集desc = substr(desc,2);'或類似的東西。 – paxdiablo 2010-05-25 05:03:26

2

在這種情況下,您希望使用全文搜索索引。要知道,有一些漁獲不過,如最小的字,長度,停止字等

對FTS的語法如下:

WHERE MATCH (field) AGAINST ('text');