2009-09-09 91 views
0

考慮這種情況,我的數據庫表有300000行,並且有一個全文索引。只要搜索完成,它就會鎖定數據庫,並且不允許其他人登錄到門戶。Mysql FULLTEXT索引,搜索鎖表

任何有關如何在這裏整理出的東西的建議將是非常可觀的。

+0

您確定使用此全文索引嗎?嘗試在查詢中使用解釋。 – Pomyk 2009-09-09 09:13:22

回答

2

登錄是否對錶執行寫操作?例如。 '上次訪問'時間?

如果是這樣,您可能會期望類似這樣的行爲,因爲MyISAM寫入對整個表執行鎖定。通常這可以通過不使用noddy MyISAM並轉而使用InnoDB來解決,它具有行級鎖定(以及其他所需的數據庫特性)。

問題當然是,您只能通過MyISAM進行全文搜索。

所以你需要分割你的表。如果您可以將閱讀繁重和全文的東西放在與需要書寫的東西不同的表格中(但使用相同的主鍵鏈接),則可以使其成爲兩個操作不會相互影響的東西。

更好的是,將表的大部分遷移到InnoDB,只留下MyISAM中的全文字段。除全文搜索以外的所有內容都可以避開MyISAM表,並且只使用展現出更好的鎖定性能的InnoDB表。就個人而言,我現在傾向於將所有內容都存儲在InnoDB表中,包括文本,並將MyISAM表中的文本的第二個副本存儲在純粹的全文searchbait目的中;這簡化了查詢和代碼,並將InnoDB的一致性優勢帶入了文本內容中,並且我還使用它來處理searchbait以獲取詞幹和MySQL的全文通常不支持的其他功能。但這確實意味着您必須在存儲上花費更多空間。

您還可以通過減少寫入次數來改善問題。例如,如果它是是您正在編寫的「上次訪問」時間戳,則可以避免編寫該內容,除非在前一時間和現在之間已經過去了一分鐘,因爲沒有人需要知道確切的時間第二個人最後訪問了該網站。

+0

或者您可以使用複製並使主用戶InnoDB在從服務器上使用MyISAM。然後你可以在從機上進行全文搜索。 – ejunker 2010-02-11 16:35:58

+0

聽起來很不錯!您是否在實踐中做過這些工作,有沒有注意可能與發動機功能不匹配的問題? – bobince 2010-02-11 18:44:06

0

如果您使用外部搜索引擎或MySQL搜索插件Lucene或Sphinx,它們應該能夠在不鎖定表的情況下讀取和索引。它們存儲本地版本的索引記錄,因此它們不必經常閱讀表格,也不需要寫入表格。