0

我繼承了用MySQL和PHP構建的自定義CMS的代碼庫,它使用全文索引在內容(文本)字段中進行搜索。在分析數據庫結構,我發現所有相關表格以下列方式(簡化的例子)創建:對於文本列有兩個全文索引真的有必要嗎?

CREATE TABLE `stories` (
    `story_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `headline` varchar(255) NOT NULL DEFAULT '', 
    `subhead` varchar(255) DEFAULT NULL, 
    `content` text NOT NULL, 
    PRIMARY KEY (`story_id`), 
    FULLTEXT KEY `fulltext_search` (`headline`,`subhead`,`content`), 
    FULLTEXT KEY `headline` (`headline`), 
    FULLTEXT KEY `subhead` (`subhead`), 
    FULLTEXT KEY `content` (`content`) 
) ENGINE=MyISAM; 

正如你所看到的,在通常的方式是建立全文索引,但隨後每列分別添加我相信這也創造了兩個不同的指標。

我已經聯繫了以前的開發人員,他說這是創建全文索引的「正確」方式,但根據我在互聯網上找到的每一個示例,都沒有這樣的要求,這將是不夠的:

CREATE TABLE `stories` (
    `story_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `headline` varchar(255) NOT NULL DEFAULT '', 
    `subhead` varchar(255) DEFAULT NULL, 
    `content` text NOT NULL, 
    PRIMARY KEY (`story_id`), 
    FULLTEXT KEY `fulltext_search` (`headline`,`subhead`,`content`) 
) ENGINE=MyISAM; 

表有超過80,000行,並正變得越來越難以管理(完整的數據庫是接近10GB),所以我想擺脫任何不必要的數據。

非常感謝提前。

+0

你如何查詢這個或這些與答案直接相關的索引。例如,您是否有僅僅搜索內容的查詢? – Steve 2013-03-08 15:59:26

+0

實際上,搜索工具允許用戶定義將用於執行搜索的字段,但根據我用MATCH()語句處理的知識(以及CMS中的相關PHP代碼),例如:SELECT *從故事匹配(內容).. – Proteo 2013-03-08 16:07:58

回答

0

爲自己弄明白的方法是使用EXPLAIN和查詢(匹配)來查看實際使用的索引。如果您有一個查詢不使用索引且速度很慢,請創建一個索引(或者手動通知它使用index_hint),然後再次嘗試EXPLAIN以查看是否使用索引。

我認爲,如果允許用戶只指定一列進行搜索,並且該列不是第一個或索引列表中唯一的列,則查詢/匹配將使用非索引順序搜索。換句話說,通過您的索引(headline,subhead,content),我預計該索引將用於任何具有全部三列的搜索,或者僅使用headline,或使用headlinesubhead,但不能僅用於子標題,並且不僅僅是內容。我有一段時間沒做,所以現在可能會有所不同。但EXPLAIN應該揭示發生了什麼。

如果您使用EXPLAIN檢查所有可能的查詢,並發現其中任何一個索引都沒有使用,則不需要它。

相關問題