簡體   English   中英

組合索引與多個單索引與全文索引的查詢性能

[英]Query performance of combined index vs. multiple single indexes vs. fulltext index

背景:我有一個包含 500 萬個地址條目的表,我想搜索不同的字段(客戶姓名、聯系人姓名、zip、城市、電話……),最多 8 個字段。 數據相當穩定,一天最多修改50次,所以幾乎只有讀權限。

用戶不應該提前告訴我他在搜索什么,我還希望支持組合搜索(搜索詞的 AND 連接)。 例如,“lincoln+lond”應在任何搜索字段中搜索包含兩個搜索詞的所有記錄,以及以任何詞開頭的條目(如本例中的“London”)。

問題:現在我需要為這個搜索表選擇一個索引策略。 (附帶說明:我正在嘗試實現亞秒級響應時間,最差響應時間應該是 2 秒。)在性能方面更好的是:

  1. 從所有可查詢的列中做一個組合索引(需要 2 個,因為達到了 900 字節的索引限制)
  2. 在每個可查詢列上放置單個索引
  3. 在可查詢列上建立全文索引並使用全文查詢

我放棄了第 1 點,因為它似乎沒有任何優勢(索引使用會受到限制,並且不會有“索引搜索”,因為並非所有字段都適合一個索引)。

問題:現在,我應該使用多個單索引變體還是應該使用 go 和全文索引 沒有其他方法可以實現上述功能?

兩者都試一下,看看哪個在您的系統上更快。 數據庫優化幾乎沒有硬性規定,這實際上取決於您的環境。

最初,我正要建議使用FTS ,因為它具有許多強大的性能特性。 尤其是在處理各種查詢時。 (例如 x AND y。x NEAR y 等)。

但在開始討論 FTS 的專業人士之前,我剛剛檢查了您的服務器版本 -> sql2000。

可憐的東西。 FTS 那時非常簡單,所以堅持使用多個單一索引

我們使用 Sql2008 並且......它搖滾。

哦,順便說一句。 你知道Sql2008(免費版)里面有FTS嗎? 是否可以升級?

如果可以的話,從 sql2000 -> sql2008 開始是非常值得的。

但是,是的,堅持使用您的 MSI 選項。

我同意 Grauenwolf 的觀點,我想添加一個關於索引的注釋。 請記住,如果您使用如下語法:

SELECT field1, field2, field3
FROM table
WHERE field1 LIKE '%value%

然后在field1上搜索時無論如何都不會使用任何索引,您必須求助於全文索引。 為了完整起見,上述語法返回field1包含的所有行(不一定在開頭)。 如果您必須搜索“包含”,則全文索引可能更合適。

回答我自己的問題:

我選擇了“多個單一索引”選項。 我最終為每個查詢的列建立了一個索引,每個索引只包含列本身。 搜索效果非常好,響應時間大多為亞秒級。 有時它需要 2-3 秒,但我將其歸因於我的數據庫服務器(具有 3GB 內存和慢速磁盤的幾年前的筆記本電腦)。

我沒有測試全文選項,因為它不再需要(而且我沒有時間去做。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM