Я создал таблицу MySQL со столбцом JSON с именем deliveries
:
CREATE TABLE `modules` (
`id` integer UNSIGNED AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`exam_date` datetime NOT NULL,
`deliveries` json DEFAULT NULL,
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Я вставляю тысячи строк фиктивных данных и проверяю производительность различных комбинаций индекса и запрашивать, создавая и удаляя индексы.
Я заметил, что операция по созданию одного конкретного индекса завершается неудачно, когда таблица находится ниже приблизительно 100 000 строк данных, но не работает над ней. Операция выглядит следующим образом:
CREATE INDEX deliveries_index ON modules( ( CAST(JSON_EXTRACT(deliveries, '$.ids') AS UNSIGNED ARRAY) ) );
Когда происходит сбой, генерируется эта ошибка, которая обычно связана с поврежденной таблицей:
ERROR 1034 (HY000): Incorrect key file for table 'modules'; try to repair it
Но если я удалю примерно 20 000 строк, выполнение той же операции успешно создает индекс. Ремонт стола не требуется.
Query OK, 0 rows affected (2.63 sec)
Records: 0 Duplicates: 0 Warnings: 0
Я не думаю, что в ячейке недостаточно места, потому что я могу продолжать создавать сотни тысяч строк.
Я проверил журнал ошибок MySQL на /var/log/mysql/error.log
, но он не содержит записи о том, что индекс не может быть создан.
Я немного застрял. Как я могу отладить, чтобы понять это лучше? Моему локальному устройству разработчика просто не хватает энергии, и это будет хорошо в сложной производственной среде? Или я обнаружил ошибку с этими типами индексов, которые используют CAST () и функциональную часть вместо столбца. Я не хочу делать вывод, что это решение не подходит, пока я не устраню любую человеческую ошибку.
Все советы очень приветствуются.
(с использованием MySQL v8.0.18)