2010-06-28 52 views
3

我打算通過網站實現數據庫搜索 - 我知道有全文搜索由mysql提供,但事實證明,它不支持innodb引擎(我需要交易支持)。 其他選項正在使用獅身人面像或類似的索引應用程序。但是,它們需要對數據庫結構進行重新分解,並且可能需要比我更多的時間來實施。執行數據庫搜索通過查詢使用像

所以我決定採取每個表並將所有相關的列連接到一個新添加的QUERY列。這個查詢列也應該從其他相關表的列中招募。

這樣做,我將使用表中查詢列上的'like'子句進行搜索,以返回特定域(相關表組)的結果。

由於我的數據庫預計不會太大(<最大的表中有1行),所以我期待合理的查詢時間。

有沒有人同意這種方法或有更好的主意?

回答

6

對於使用LIKE和通配符的解決方案,您不會感到滿意。它比使用全文搜索技術慢數百或數千倍。

看我的介紹Practical Full-Text Search in MySQL

我不建議將值複製到QUERY列中,而是將值複製到MyISAM表中並在其中定義FULLTEXT索引。你可以使用觸發器來做到這一點。

您不需要將值連接在一起,只需要主鍵列和每個可搜索的文本列。

CREATE TABLE OriginalTable (
    original_id SERIAL PRIMARY KEY, 
    author_id INT, 
    author_date DATETIME, 
    summary TEXT, 
    body TEXT 
) ENGINE=InnoDB; 

CREATE TABLE SearchTable (
    original_id BIGINT UNSIGNED PRIMARY KEY, -- not auto-increment 
    -- author_id INT, 
    -- author_date DATETIME, 
    summary TEXT, 
    body TEXT, 
    FULLTEXT KEY (summary, body) 
) ENGINE=MyISAM; 
0

不,它不是最佳的,因爲它強制讀取所有行。但是,如果桌子很小(我不知道1mn的含義是什麼),那麼它在某種程度上可能是可以接受的。

此外,您可以限制搜索功能。例如,有些網站限制使用搜索功能,而不會使用其他請求x分鐘,而其他網站則強制您輸入驗證碼。

1

您需要爲查詢列添加索引。如果在搜索表達式的開始處有一個通配符,則MySQL不能使用該索引。

如果除「等於」(LIKE 'test')或「開始於」(LIKE 'test%')以外的任何其他搜索,MySQL將不得不掃描每一行。例如,「包含」搜索(LIKE '%test%')無法使用索引。

您可以允許「結束」('LIKE %test),但是您必須構建一個反向列來索引,以便您可以實際使用LIKE 'test%'以使用該索引。

任何完整的掃描速度都會變慢,行越多,速度越慢。場地越大,它會變得越慢。

您可以看到使用LIKE的限制。因此,您可以創建一個名爲標籤的表格,在該表格中將單個關鍵詞鏈接到每個條目而不是使用整個文本,但即使使用標籤,我仍會堅持「等於」和「以......開頭」。

使用LIKE沒有索引的幫助應限於罕見的即席查詢或非常小的數據集。