Mysql

執行具有布爾全文搜尋的查詢時出現 OOM 錯誤?

  • October 30, 2021

在執行其中包含布爾全文搜尋的查詢時,我遇到了間歇性的 oom 錯誤。

我在 AWS Aurora (t2.medium) 上。

這是一個範例查詢,考慮到表“sets”在列(savename、title)上有一個全文索引,並且其中有大約 200 萬行。

       select          sets.id, sets.title,
                       drafts.draftId as draftId,
                       folderSets.folderId as folderId,
                       concat_ws(' ', savedBy.firstname, savedBy.lastname) as savedBy,
                       match(sets.savename, sets.title) against ("+s*" in boolean mode) as relevance
       from            sets as sets
       join            folderSets as folderSets on folderSets.setId = sets.id
       join            folders as folders on folders.id = folderSets.folderId 
       left join       draftSets as drafts on drafts.originalId = sets.id and drafts.userId = ?
       left join       users as savedBy on savedBy.id = folderSets.userId
       where           (folders.userId = ?)
                       and match(sets.savename, sets.title) against ("+s*" in boolean mode)
       order by        relevance
       limit           0, 25;

此查詢大約需要 5 秒才能執行。如果我敲了幾次,查詢很可能會失敗並出現 OOM。

如果我將布爾全文搜尋片語從“+s*”更改為“+sam*”——所以萬用字元之前有更多字元——相同的查詢在大約 0.15 秒內執行,沒有任何問題。

如果我從查詢中刪除布爾搜尋 altogehter,查詢執行得更快,沒有任何問題。

因此,查詢的布爾全文部分似乎發生了一些事情,達到了 mysql 限制。

以下是 innodb 全文系統變數:

ft_boolean_syntax................... + -><()~*:""&|
ft_max_word_len..................... 84
ft_min_word_len..................... 1
ft_query_expansion_limit............ 20
ft_stopword_file.................... /dev/null
innodb_ft_aux_table................. 
innodb_ft_cache_size................ 8000000
innodb_ft_enable_diag_print......... OFF
innodb_ft_enable_stopword........... OFF
innodb_ft_max_token_size............ 84
innodb_ft_min_token_size............ 1
innodb_ft_num_word_optimize......... 2000
innodb_ft_result_cache_limit........ 2000000000
innodb_ft_server_stopword_table..... 
innodb_ft_sort_pll_degree........... 2
innodb_ft_total_cache_size.......... 640000000
innodb_ft_user_stopword_table.......

有沒有人對可以進行任何調整以減少與布爾全文相關的 OOM 的可能性有任何建議?我不清楚這是可以/應該在 sql 查詢級別/mysql innodb 設置級別/或者我需要增加 aws rds 實例大小的情況。

在此先感謝您的幫助!

聽起來您可能需要 500M x 5 個程序並且記憶體不足。

您的選擇:

  • 不要要求這麼多單詞(所有單詞都以“s”開頭)。
  • 不允許使用者請求“s*”。
  • 獲得更多記憶體。
  • 降低innodb_buffer_pool_size以釋放一些 RAM
  • 看看是否可以為 AWS Aurora 配置更多交換空間——在極少數情況下同時遇到如此大的查詢。最好放慢速度而不是崩潰。
  • 減少innodb_ft_result_cache_limit——然後處理可能導致查詢失敗的結果。

同時,folderSets聞起來像多:多映射表

引用自:https://dba.stackexchange.com/questions/301787