Mariadb 查询使用 match() against() 内存不足
Mariadb query runs out of memory with use of match() against()
我有一个非常大的 table(大约 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, core i7
谢谢。
阅读下面的 3 个变量并进行实验:
| innodb_ft_cache_size | 8000000 |
| innodb_ft_result_cache_limit | 2000000000 |
| innodb_ft_total_cache_size | 640000000 |
如果您没有成功,请在 bugs.mysql.com 提交错误报告(并在此处 post 提交错误编号)。
您应该将 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服务器
我有一个非常大的 table(大约 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, core i7
谢谢。
阅读下面的 3 个变量并进行实验:
| innodb_ft_cache_size | 8000000 |
| innodb_ft_result_cache_limit | 2000000000 |
| innodb_ft_total_cache_size | 640000000 |
如果您没有成功,请在 bugs.mysql.com 提交错误报告(并在此处 post 提交错误编号)。
您应该将 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服务器