MySQL Ошибка 1032 "Не могу найти запись в таблице"

Я задал этот вопрос вчера на https://dba.stackexchange.com/posts/233294 и не получил никаких ответов, поэтому я пытаюсь здесь.

Я получаю ошибки MySQL 1032 "Не удается найти запись в человеке" для некоторых запросов в моей базе данных, и я не могу их устранить.

Вот таблица:

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `last_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `first_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `dob` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `person_full_idx` (`last_name`,`first_name`,`title`)
) ENGINE=InnoDB AUTO_INCREMENT=4448 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Неудачный запрос

SELECT * FROM person p0_
WHERE MATCH (p0_.last_name , p0_.first_name , p0_.title) AGAINST ('anne' IN BOOLEAN MODE) > 0.5
ORDER BY p0_.last_name ASC, p0_.first_name ASC, p0_.dob ASC;

Если я возьму любой из пунктов заказа, запрос выполняется нормально. И если я поменяю anne на anna, запрос выполняется нормально со всеми тремя предложениями order by. В таблице есть несколько Анн, примерно столько же, сколько и Анны.

Журнал ошибок MySQL содержит кучу этих сообщений об ошибках при каждом сбое запроса:

2019-03-27T17:31:27.891405Z 9 [Warning] [MY-012853] [InnoDB] Using a
partial-field key prefix in search, index `FTS_DOC_ID_INDEX` of table 
`database`.`person`. Last data field length 8 bytes, key ptr now 
exceeds key end by 4 bytes. Key value in the MySQL format:
len 4; hex 05110000; asc     ;

Я не использую репликацию, и вставки, обновления и удаления все успешно для записей anne. Я удалил и пересоздал полнотекстовый индекс без улучшений. Я сбросил и перезагрузил базу данных и получил ту же ошибку.

Запрос не вызывает сбоев в работе (mysql Ver 15.1 Distrib 10.1.37-MariaDB) с теми же данными. Насколько я могу судить, это происходит только на моем компьютере разработчика (mysql Ver 8.0.15 для osx10.14 на x86_64 (Homebrew)).

Что я должен попробовать дальше?

1 ответ

Решение

Как отмечено в комментарии выше, это известная ошибка в MySQL 8.0: https://bugs.mysql.com/bug.php?id=93241

Временный обходной путь заключается в увеличении размера sort_buffer_size, Размер sort_buffer по умолчанию в MySQL 8.0 составляет 256 КБ, а максимальное значение, которое вы можете настроить, составляет 2^32-1 или 2^64-1.

Ошибка может повториться, если вы запустите запрос, который соответствует большему количеству строк, достаточно того, что он слишком велик для вашего увеличенного sort_buffer_size,

Я бы предостерег от увеличения sort_buffer_size очень большой, потому что каждый поток, который выполняет этот запрос, выделяет свой собственный буфер сортировки.

Предположим, вы увеличиваете sort_buffer_size до 1 ГБ, а затем 100 одновременно работающих клиентов одновременно выполняют полнотекстовый поиск! Вы можете случайно заставить MySQL превысить вашу общую системную память, и вы не будете предупреждены, когда это произойдет.

Другие вопросы по тегам