Индексирование столбца MySQL JSON с CAST () и частью функционального ключа не выполняется выше определенного номера строки - PullRequest
0 голосов
/ 30 апреля 2020

Я создал таблицу 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...