3

如果要使用MySQL Full Text Search功能,請在類型爲VARCHAR的字段上定義全文索引。當行被INSERT和UPDATE時,mysql必須保持索引是最新的。我的問題是:MySQL何時重建FTS索引?MySQL何時重建FTS索引?

  • A)在發生INSERT或UPDATE後立即影響索引。
  • B)當第一個SELECT運行時需要最近受到UPDATE或INSERT影響的索引。
  • C)別的東西。

不必要的背景資料:我的經驗似乎認爲選項B.這是正確的?我問,因爲我一直在經歷突然的隨機慢查詢,它會執行全文搜索,我不知道爲什麼有些緩慢而不是其他的。我的直覺是,如果他們正在等待mysql重建FTS索引,查詢可能會很慢,但我不知道這是MySQL的工作原理。

# Query_time: 61.775612 Lock_time: 10.110924 Rows_sent: 20 Rows_examined: 222498 
SELECT SQL_CALC_FOUND_ROWS id 
FROM members 
WHERE 
    AND MATCH (bio,profile_text,name) AGAINST ('building surveyor') 
    AND MATCH (town, postcode, country) AGAINST ('united kingdom, liverpool'); 

通知的Lock_time:隨機慢查詢(通常是相同的查詢下的第二運行),不存在慢UPDATE或INSERT在慢日誌的例子。我在慢日誌中看不到任何其他INSERT或UPDATE,所以我不確定它在等待什麼。這就是爲什麼我猜測它可能正在等待FTS指數重建?

回答

1

考慮使用... AGAINST('"building surveyor"')來獲得該短語而不是分散在任何地方的那兩個詞。

您使用的是MyISAM還是InnoDB?他們工作方式不同

MyISAM,我認爲,更新插入/更新行時的FT索引。

InnoDB,我認爲,排隊更改,並最終將它們寫入磁盤。這通常使寫入速度比MyISAM更快。

兩者都沒有引擎重建索引,除非明確要求。