Aurora Serverless MySQL дает слишком большой размер столбца индекса, несмотря на правильные настройки

Я пытаюсь добавить индекс к существующей таблице в рамках процесса обновления форумов сообщества Invision. База данных размещена в AWS Aurora Serverless, совместимом с MySQL 5.6. Однако каждый раз я получаю сообщение об ошибке:

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

Вот подробности о таблице и схеме:

+---------------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+--------------------+----------+--------------------+---------+
| Name          | Engine | Version | Row_format | Rows  | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation          | Checksum | Create_options     | Comment |
+---------------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+--------------------+----------+--------------------+---------+
| ibf_core_tags | InnoDB |      10 | Dynamic    | 36862 |            299 |    11026432 |               0 |     13189120 |   4194304 |          95183 | NULL        | NULL        | NULL       | utf8mb4_unicode_ci |     NULL | row_format=DYNAMIC |         |
+---------------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+--------------------+----------+--------------------+---------+
+--------------------+--------------+------+-----+---------+----------------+
| Field              | Type         | Null | Key | Default | Extra          |
+--------------------+--------------+------+-----+---------+----------------+
| tag_id             | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| tag_aai_lookup     | char(32)     | NO   | MUL |         |                |
| tag_aap_lookup     | char(32)     | NO   | MUL |         |                |
| tag_meta_app       | varchar(200) | NO   | MUL |         |                |
| tag_meta_area      | varchar(200) | NO   |     |         |                |
| tag_meta_id        | int(10)      | NO   |     | 0       |                |
| tag_meta_parent_id | int(10)      | NO   |     | 0       |                |
| tag_member_id      | int(10)      | NO   | MUL | 0       |                |
| tag_added          | int(10)      | NO   | MUL | 0       |                |
| tag_prefix         | int(1)       | NO   |     | 0       |                |
| tag_text           | varchar(255) | YES  |     | NULL    |                |
+--------------------+--------------+------+-----+---------+----------------+

Кодировка по умолчанию для таблицы - utf8mb4, а настройка innodb_large_prefix - ON.

Я пытаюсь выполнить следующую операцию:

ALTER TABLE `ibf_core_tags` ADD KEY `tag_text` (`tag_text`(191));

Я бы подумал, что 191 * 4 = 764, что меньше значения 767 байт, которое я превышаю. Это ошибка в Aurora Serverless? Есть ли способ обойти эту проблему? Я попытался изменить таблицу на MyISAM, чтобы добавить индекс, но на самом деле получаю ту же ошибку, когда пытаюсь это сделать.

Используя локальную установку MySQL 5.6, я смог выполнить этот запрос ALTER TABLE в той же базе данных, поэтому я не уверен, почему Aurora Serverless отличается.

В итоге я попробовал это на несерверном экземпляре Aurora, и у меня возникла та же проблема.


person Jyosua    schedule 20.05.2019    source источник
comment
Aurora - это не InnoDB, это механизм хранения с закрытым исходным кодом, созданный Amazon. Многие параметры конфигурации InnoDB игнорируются Aurora.   -  person Bill Karwin    schedule 20.05.2019
comment
Я знаю, но innodb_large_prefix - это один из вариантов, который, согласно их документации, не игнорируется, поэтому я не понимаю, почему возникает эта проблема.   -  person Jyosua    schedule 21.05.2019
comment
Будет ли это работать, если вы измените tag_text на varchar (191), а затем объявите индекс, не пытаясь использовать синтаксис префикса индекса?   -  person Bill Karwin    schedule 21.05.2019
comment
Спросите у службы поддержки. Тогда опубликуйте ответ здесь.   -  person Paul Spiegel    schedule 21.05.2019
comment
@BillKarwin Отличная идея. Я попробовал это, убедившись, что не будет потери данных, и, конечно же, это сработало. Я немного изумлен. Что произойдет с новым индексом, если я изменю размер самого столбца на varchar (191)?   -  person Jyosua    schedule 21.05.2019
comment
На самом деле я предлагал изменить размер столбца до varchar (191), а затем создать для него индекс. Но я рад, что это сработало для вас. Я бы предположил, что Aurora не поддерживает префиксы индексов? Я не знаю. Это одна из проблем Авроры. Они изменили кучу внутренних компонентов механизма хранения, но не очень-то готовы предоставить информацию о том, что именно они изменили.   -  person Bill Karwin    schedule 21.05.2019
comment
Извините, я ошибся: я имел в виду, что изменил размер столбца до 191, а затем создал для него индекс. Мне было интересно, что произойдет, если я снова изменю размер столбца до 255. Если вы не укажете длину префикса индекса, я не знаю, что произойдет.   -  person Jyosua    schedule 21.05.2019
comment
Если вы попытаетесь переопределить размер столбца до 255, я ожидаю, что ошибка повторится, если механизм хранения не сможет сохранить индекс для строк длиной более 4 * 191 байт. Вот что происходит в обычном MySQL (т.е. не в Aurora). У меня нет под рукой экземпляра Aurora, чтобы это проверить.   -  person Bill Karwin    schedule 21.05.2019
comment
Ага, вот что случилось.   -  person Jyosua    schedule 21.05.2019


Ответы (1)


У меня была такая же проблема с проектом Slim PHP, использующим Laravel для соединений с БД. По умолчанию AWS Aurora Serverless использует формат файла Antelope, который по умолчанию имеет формат строки COMPACT. Нам нужен формат файла Barracuda и формат строки DYNAMIC, чтобы можно было использовать большие префиксы ключа индекса (ссылка).

Я создал настраиваемую группу параметров и явно установил следующие параметры:

  • innodb_file_format = Barracuda
  • innodb_file_per_table = 1
  • innodb_large_prefix = 1

Эти параметры можно устанавливать в соответствии с документация AWS Aurora Serverless.

Однако установка этих параметров сама по себе не устранила проблему. Таблицы все еще создавались с форматом строки COMPACT. В параметрах подключения к БД мне также пришлось установить 'engine' => 'InnoDB ROW_FORMAT=DYNAMIC' (ссылка). Этот синтаксис предназначен для Laravel, но, надеюсь, он указывает другим в правильном направлении, поскольку я только что потратил целый день на выяснение этого :)

person wsamoht    schedule 09.09.2019
comment
Я постараюсь попробовать это в ближайшем будущем и посмотрю, решит ли это мою проблему, спасибо! - person Jyosua; 10.09.2019