Pull to refresh

Comments 11

В версии 8.0.17 появились Multi-Valued Indexes (https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-multi-valued). Очень странно, что о них - ни слова...

Если не указано иное, приведение значения к строке устанавливает сопоставление на utf8mb4_0900_ai_ci

Зависит от текущих настроек сервера. ЕМНИП используется default collation для character_set_server, но могу и ошибаться (проверять - лень).

Ещё неупомянутый момент. Если создаётся индекс по вычисляемому столбцу, то нет смысла делать этот столбец хранимым. То есть разумно явно объявить его виртуальным. Если план будет использовать созданный по нему индекс, то значение будет не рассчитываться, а извлекаться из индекса, если же индекс не будет использоваться - то может быть и так, и эдак, не угадаешь. Но дисковое пространство сэкономится точно.

Спасибо за комментарий. Автор, возможно, просто не стал слишком сильно нагружать текст. Сделаю заметку об MVI-индексе. Судя даже по названию, навскидку, тема непростая и интересная.

Что по поводу VIRTUAL в mariadb - это тоже скрытый генерируемый столбец ?

VIRTUAL в отношении вычисляемого поля таблицы - это его характеристика. Она просто говорит, что значение вычисляемого поля не сохраняется в теле (в данных) таблицы. Оно вычисляется каждый раз, когда требуется - либо считается согласно выражению, либо извлекается из индекса. По сути - способ попробовать немножко сэкономить дисковое пространство за счёт незначительного увеличения накладных расходов на вычисление. Эта характеристика никак не связана с невидимостью (INVISIBLE), являющейся отдельной (и совершенно независимой) характеристикой.

итак, в статье указано что в mysql все поля созданные из частей json физически хранятся на диске в скрытом либо явном столбце.

Вопрос: в mariadb поля VIRTUAL, отобажающие части JSON, также хранятся в скрытом столбце или чисто вычисляемые ?

Ещё раз внимательно прочитал статью - но нигде не нашёл вот ни полслова про физическое хранение на диске. О каком фрагменте речь?

Вообще что в MySQL, что в MariaDB вычисляемые поля по умолчанию - виртуальные, и хранятся на диске только в случае, если при создании поля явно указать STORED (для MariaDB ещё и PERSISTENT). Динамически вычисляемые "скрытые" поля, само собой, виртуальные, т.е. нигде не хранятся.

В MySQL 5.7 нужно создавать промежуточный сгенерированный столбец

С версии MySQL 8.0.13 промежуточный этап сгенерированного столбца можно пропускать и создавать «функциональные индексы»

Функциональный индекс — это индекс по выражению, а не столбцу. Он очень похож на сгенерированный столбец, так как реализован с помощью скрытого сгенерированного столбца! Генерируемый столбец создавать больше не нужно, но он создаётся.

Отлично. Теперь ткните пальцем в то место, где что-то говорят про хранение физически на диске. Нет, я понимаю, что в области хранения индекса на диске эти значения присутствуют - индекс просто обязан хранить в элементе значение индексного выражения для этого элемента,- но вот в теле таблицы на диске ничего, связанного с этим вычисляемым столбцом, не хранится.

Т.е. в данном случае это обычное виртуальное вычисляемое поле - просто не отображаемое в структуре. Вернее, "абы как" такое поле - в реальности оно для всего массива не вычисляется вообще каким-то особым образом, а, как и любое другое виртуальное поле, считается на общих основаниях. Потребовалось (в данном случае - для создания или корректировки индекса при изменении данных) - посчитали. Так что правильнее было бы сказать не "реализован с помощью скрытого сгенерированного столбца", а "реализован по технологии, используемой для скрытого виртуального генерируемого столбца".

без пояснений трудно понять что имелось ввиду

Вроде бы баг наблюдается исключительно для композитных индексов.

Sign up to leave a comment.