AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 301787
Accepted
user1031947
user1031947
Asked: 2021-10-28 14:51:05 +0800 CST2021-10-28 14:51:05 +0800 CST 2021-10-28 14:51:05 +0800 CST

运行具有布尔全文搜索的查询时出现 OOM 错误?

  • 772

在运行其中包含布尔全文搜索的查询时,我遇到了间歇性的 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 实例大小的情况。

在此先感谢您的帮助!

mysql full-text-search
  • 2 2 个回答
  • 141 Views

2 个回答

  • Voted
  1. mustaccio
    2021-10-28T15:10:17+08:002021-10-28T15:10:17+08:00

    阅读手册可以找到该innodb_ft_result_cache_limit变量的描述:

    每个全文搜索查询或每个线程的 InnoDB 全文搜索查询结果缓存限制(以字节为单位)。中间和最终 InnoDB 全文搜索查询结果在内存中处理。用于innodb_ft_result_cache_limit对全文搜索查询结果缓存设置大小限制,以避免在非常大的 InnoDB 全文搜索查询结果(例如,数百万或数亿行)的情况下过度消耗内存。处理全文搜索查询时,根据需要分配内存。如果达到结果缓存大小限制,则返回错误,指示查询超出最大允许内存。

    此变量的默认值在您的情况下有效,这意味着每次运行查询时,它都会尝试分配最多 2 GB(在“G”的老式意义上)来存储“中间和最终文本搜索的结果”。这是 MySQL 分配的所有其他内存池的补充。

    order by relevance limit 0, 25在您的查询中可能意味着必须在内存中检索和排序匹配查询搜索条件的整个结果集,然后才能返回 25 行。

    为了避免 OOM 条件,您可以 innodb_ft_result_cache_limit针对您的用例减少一个更合理的值(如果您的文本搜索条件太宽,这可能会导致错误),或者扩大您的服务器以适应您的需求。

    • 1
  2. Best Answer
    Rick James
    2021-10-30T05:51:54+08:002021-10-30T05:51:54+08:00

    听起来您可能需要 500M x 5 个进程并且内存不足。

    您的选择:

    • 不要要求这么多单词(所有单词都以“s”开头)。
    • 不允许用户请求“s*”。
    • 获得更多内存。
    • 降低innodb_buffer_pool_size以释放一些 RAM
    • 看看是否可以为 AWS Aurora 配置更多交换空间——在极少数情况下同时遇到如此大的查询。最好放慢速度而不是崩溃。
    • 减少innodb_ft_result_cache_limit——然后处理可能导致查询失败的结果。

    同时,folderSets闻起来像多:多映射表

    • 0

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve