Запросу Mariadb не хватает памяти с использованием match() против()

#full-text-search #mariadb #match #match-against #against

#полнотекстовый поиск #mariadb #совпадение #сопоставление с #против

Вопрос:

У меня очень большая таблица (около 50 ГБ), но с несколькими столбцами:

 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 ГБ оперативной памяти, core i7

Спасибо.

Ответ №1:

Прочитайте о 3 переменных ниже и поэкспериментируйте с ними:

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

Если вы не добились успеха, отправьте отчет об ошибке по адресу bugs.mysql.com (и опубликуйте номер ошибки здесь).

Комментарии:

1. Привет @RickJames Я читал о переменных, и я попробовал с: --innodb-buffer-pool-size=4G и --innodb-ft-result-cache-limit=4G и работает гладко. Большое вам спасибо

2. Привет @ Rick James, я столкнулся с Error Code: 188. FTS query exceeds result cache limit . У меня есть большой экземпляр с 128 ГБ оперативной памяти, поэтому я увеличил innodb_ft_result_cache_limit до максимального значения, но все равно я сталкиваюсь с ошибкой. У вас есть какие-нибудь предложения о том, как настроить параметры, чтобы избежать подобных ошибок? К вашему сведению, innodb_ft_cache_size также установлено значение 4 ГБ.

3. @thijsvdp — Происходит ли это для необычных имен, а также для распространенных имен? сообщение об ошибке MariaDB: jira.mariadb.org

4. Нет только для очень часто встречающихся имен. Например, я ищу по названиям компаний. Одним из примеров является «apple inc». Интересно, что поиск по '"apple inc"' (точное совпадение) приводит к этой ошибке, тогда как поиск по 'apple inc' (и / или совпадению) не выдает этих ошибок и отлично работает. Поиск по ' apple inc' не приводит к ошибкам, но занимает намного больше времени. Наконец, поиск по '"apple" "inc"' также выдает ошибки ограничения кэша FTS. Есть идеи, почему это происходит?

5. @thijsvdp — '"apple inc"' — это то, что вы хотите; какую ошибку это выдает? Последние два будут «соответствовать» «inc apple» или «apple records inc», которые вам не нужны.

Ответ №2:

Вы должны установить innodb_buffer_pool_size примерно на 80% вашей памяти.

Это доступно для mysql или mariadb. Смотрите документ mariadb для innodb: https://mariadb.com/kb/en/innodb-system-variables/#innodb_buffer_pool_size

Отредактируйте файл конфигурации mysql или mariadb:

 [mysqld]
innodb_buffer_pool_size=50G
  

Перезапустите сервер mysql