Как INDEX JSON ARRAY хранится в собственном столбце - PullRequest
0 голосов
/ 11 июля 2020

у меня есть эта таблица:

CREATE TABLE `datacollector` (
  `id` binary(16) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `processed` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N',
  `processed_at` timestamp NULL DEFAULT NULL,
  `request` json NOT NULL,
  `response` json NOT NULL,
  `response_date` timestamp GENERATED ALWAYS AS (from_unixtime(json_unquote(json_extract(`response`,_utf8mb4'$.date')))) VIRTUAL NULL,
  `sha224` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `available_for` json NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_sha224` (`sha224`),
  KEY `created_at` (`created_at`) /*!80000 INVISIBLE */,
  KEY `cmoa` (`created_at`,`processed`) /*!80000 INVISIBLE */,
  KEY `response_date` (`response_date`) /*!80000 INVISIBLE */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Я использую триггер, который создает массив строк в available_for. Теперь я хотел бы создать индекс для available_for.

Я уже пробовал

ALTER TABLE `hwtools`.`datacollector` 
ADD INDEX `available_for_idx` ((CAST(json_unquote(available_for) AS UNSIGNED ARRAY)));

или

ALTER TABLE `hwtools`.`datacollector` 
ADD INDEX `available_for_idx` ((CAST(available_for AS UNSIGNED ARRAY)));

, что всегда дает мне ошибку.

JSON, который хранится в available_for, выглядит как '["getUserInfo", "stashClient"]'.

Как я могу теперь создать правильный индекс с последним MySQL 8?

Спасибо за ваш вклад в мою проблему.

1 Ответ

1 голос
/ 11 июля 2020

Многозначные индексы поддерживаются только начиная с MySQL 8.0.17 с использованием движка InnoDB.

Вам также необходимо посмотреть , какой тип используется для преобразования массива оф. unsigned array - это массив целых чисел без знака. Для массива строк используйте char(255) array или аналогичный.

Этот DDL должен работать нормально:

CREATE TABLE `datacollector` (
  `id` binary(16) NOT NULL,
  `available_for` json NOT NULL,
  PRIMARY KEY (`id`),
  KEY available_for_idx ((CAST(available_for AS char(255) ARRAY)))
) ENGINE=InnoDB;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...