Ответ 1
Использование DYNAMIC или COMPRESSED означает, что InnoDB хранит поля varchar/text/blob, которые не помещаются на странице полностью вне страницы. Но кроме этих столбцов, которые тогда учитывают только 20 байтов на столбец, ограничение размера строки InnoDB не изменилось; он по-прежнему ограничен примерно 8000 байтами в строке.
InnoDB поддерживает только индексы 767 байт на столбец. Вы можете поднять этот 3072 байта, установив innodb_large_prefix=1
и используя формат строки DYNAMIC или COMPRESSED.
Использование формата строки COMPRESSED не заставляет InnoDB поддерживать более длинные индексы.
Что касается производительности, это один из тех случаев, когда "это зависит". Сжатие, как правило, представляет собой компромисс между размером хранилища и загрузкой процессора для сжатия и распаковки. Верно, что для работы со сжатыми данными требуется немного больше процессора, но вы должны помнить, что серверы баз данных обычно ждут ввода-вывода и имеют ресурсы ЦП.
Но не всегда - если вы выполняете сложные запросы против данных, находящихся в пуле буферов, вы можете быть ограничены CPU больше, чем I/O. Таким образом, это зависит от многих факторов, таких как то, насколько хорошо ваши данные вписываются в ОЗУ, тип запросов, которые вы запускаете, и сколько запросов в секунду, а также аппаратные спецификации. Слишком много факторов, чтобы кто-либо еще мог отвечать за ваше приложение на вашем сервере. Вам просто нужно проверить его.
Ваш комментарий:
Одна из возможностей заключается в том, что индекс не подходит в пуле буферов. Производительность значительно ухудшается, если поиск по индексу требует загрузки страниц и выселения страниц во время каждого запроса SELECT. Анализ EXPLAIN не может определить, подходит ли индекс в пуле буферов.
Я не знаю, сколько столбцов или какие типы данных столбцов в вашем индексе, но если вы индексируете длинные столбцы varchar, вам следует рассмотреть использование префиксных индексов (или уменьшение длины столбцов).
Вы также можете получить больше ОЗУ и увеличить размер пула буферов.