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 превысить вашу общую системную память, и вы не будете предупреждены, когда это произойдет.