【问题标题】:Mariadb query runs out of memory with use of match() against()Mariadb 查询使用 match() against() 时内存不足
【发布时间】:2019-08-04 17:15:55
【问题描述】:

我有一个非常大的表(大约 50 GB),但列很少:

CREATE TABLE my_table (
    id BIGINT(20) NOT NULL AUTO_INCREMENT,
    id_sec BIGINT(20) NULL,
    full_name VARCHAR(100) NULL DEFAULT NULL,
    PRIMARY KEY (id),
    FULLTEXT INDEX fts_full_name (full_name)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB

当我执行以下查询时:

SELECT * FROM my_table WHERE MATCH(full_name) AGAINST('lastname middle first ' IN BOOLEAN MODE)

SELECT * FROM my_table WHERE MATCH(full_name) AGAINST('lastname middle first ')

SELECT * FROM my_table WHERE MATCH(full_name) AGAINST('lastname middle first ' IN BOOLEAN MODE) LIMIT 1000

SELECT * FROM my_table WHERE MATCH(full_name) AGAINST('lastname middle first ') LIMIT 1000

SELECT * FROM my_table WHERE MATCH(full_name) AGAINST('lastname middle first ' IN BOOLEAN MODE) LIMIT 100

SELECT * FROM my_table WHERE MATCH(full_name) AGAINST('lastname middle first ') LIMIT 100

有时会向我发送以下错误消息:

SQL Error (128): Table handler out of memory

但是当我执行时它不会发生:

SELECT * FROM my_table WHERE MATCH(full_name) AGAINST('+lastname +middle +first ' IN BOOLEAN MODE)

SELECT * FROM my_table WHERE MATCH(full_name) AGAINST('+lastname +middle +first ')

我尝试了以下值,但没有任何改进:

--key-buffer-size=20M 
--tmp-table-size=2G 
--thread-pool-max-threads=10 
--max-connections=100 
--max-heap-table-size=2G 
--innodb-buffer-pool-size=4G

有人知道会发生什么吗?或者我该如何纠正?

我的服务器在 Windows 10 (x64)、10.3.12-MariaDB (x64)、32 GB RAM、核心 i7 中运行

谢谢。

【问题讨论】:

    标签: full-text-search mariadb match match-against against


    【解决方案1】:

    您应该将 innodb_buffer_pool_size 设置为大约 80% 的内存。

    这适用于 mysql 或 mariadb。 有关 innodb,请参阅 mariadb 文档:https://mariadb.com/kb/en/innodb-system-variables/#innodb_buffer_pool_size

    编辑 mysql 或 mariadb 配置文件:

    [mysqld]
    innodb_buffer_pool_size=50G
    

    重启mysql服务器

    【讨论】:

      【解决方案2】:

      阅读以下 3 个变量并进行实验:

      | innodb_ft_cache_size            | 8000000    |
      | innodb_ft_result_cache_limit    | 2000000000 |
      | innodb_ft_total_cache_size      | 640000000  |
      

      如果没有成功,请在 bugs.mysql.com 提交错误报告(并在此处发布错误编号)。

      【讨论】:

      • 嗨@RickJames 我一直在阅读有关变量的信息,我尝试使用:--innodb-buffer-pool-size=4G--innodb-ft-result-cache-limit=4G 并且工作顺利。非常感谢
      • 嗨@Rick James,我面对的是Error Code: 188. FTS query exceeds result cache limit。我有一个具有 128GB RAM 的大型实例,因此我将 innodb_ft_result_cache_limit 增加到最大值,但我仍然面临错误。您对如何调整设置以避免此类错误有一些建议吗?仅供参考,innodb_ft_cache_size 也设置为 4GB。
      • @thijsvdp - 不常见的名称和常见的名称都会发生这种情况吗? MariaDB 错误报告:jira.mariadb.org
      • 不仅适用于非常频繁出现的名称。例如,我正在搜索公司名称。一个例子是“苹果公司”。有趣的是,搜索'"apple inc"'(完全匹配)会导致此错误,而搜索'apple inc'(和/或匹配)不会出现这些错误并且效果很好。在'+apple +inc' 上搜索不会导致错误,但需要更长的时间。最后,搜索'"apple" "inc"' 也会出现 FTS 缓存限制错误。知道为什么会这样吗?
      • @thijsvdp - '"apple inc"' -- 是你想要的;它给出了什么错误?最后两个将“匹配”“inc apple”或“apple records inc”,这是您不想要的。
      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2011-10-12
      • 2012-12-08
      相关资源
      最近更新 更多