bigton
@bigton
Web-программист

Чем практически отличаются два типа VIRTUAL и STORED?

Всем привет!

CREATE TABLE `tmp_1` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `energy` smallint(5) unsigned NOT NULL DEFAULT 0,
 `energy_max` tinyint(3) unsigned NOT NULL DEFAULT 0,
 `energy_up` tinyint(3) unsigned GENERATED ALWAYS AS (`energy` < `energy_max`) STORED,
 PRIMARY KEY (`id`),
 KEY `energy_up` (`energy_up`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT

CREATE TABLE `tmp_2` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `energy` smallint(5) unsigned NOT NULL DEFAULT 0,
 `energy_max` tinyint(3) unsigned NOT NULL DEFAULT 0,
 `energy_up` tinyint(3) unsigned GENERATED ALWAYS AS (`energy` < `energy_max`) VIRTUAL,
 PRIMARY KEY (`id`),
 KEY `energy_up` (`energy_up`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT

Есть две одинаковые таблицы, но в одном случае поле energy_up типа STORED, в другом VIRTUAL.

Ниже мои рассуждения, хотелось бы узнать насколько я прав

Насколько я понял, в случае STORED:
- результат операции будет высчитываться только при добавлении/изменении записи;
- результат будет храниться на жестком диске;
- индекс по этому полю будет храниться на жестком диске.

В случае VIRTUAL:
- результат операции будет высчитываться каждый раз при чтении;
- индекс по этому полю будет храниться в оперативной памяти.

Следовательно, если у меня нет индекса по этому полю, то при запросе
SELECT id FROM tmp_2 WHERE energy_up = 1
- сперва будет выполнено полное сканирование таблицы и вычисление значения поля для каждой записи (возможно будет создана виртуальная таблица);
- потом в виртуальной таблице будет искаться energy_up = 1

Таким образом, если индекса нет - выгодней использовать STORED, потому что просто произойдет сканирование файла таблицы, если индекс есть - выгодней использовать VIRTUAL, потому что он хранится в памяти, что быстрее чтения файла.

Вопрос: чем все таки отличаются эти два типа поля и в каких случаях какой тип использовать?

Спасибо за ответы!
  • Вопрос задан
  • 807 просмотров
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
В случае VIRTUAL:
- результат операции будет высчитываться каждый раз при чтении;
- индекс по этому полю будет храниться в оперативной памяти.

Индекс так же будет храниться как обычный индекс.
Через virtual generated column ранее можно было эмулировать функциональный индекс. Сейчас в этом необходимости уже нет.

Разница только в том, что stored хранится как часть таблицы, но вычисляется только при записи. А virtual не хранится и вычисляется при чтении.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы