1

我有一个非常大的表(大约 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 中运行

谢谢。

4

2 回答 2

1

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

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

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

于 2019-03-17T22:19:03.757 回答
0

您应该将 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服务器

于 2021-06-10T10:13:32.147 回答