Mysql
執行具有布爾全文搜尋的查詢時出現 OOM 錯誤?
在執行其中包含布爾全文搜尋的查詢時,我遇到了間歇性的 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
聞起來像多:多映射表