Всем привет!
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, потому что он хранится в памяти, что быстрее чтения файла.
Вопрос: чем все таки отличаются эти два типа поля и в каких случаях какой тип использовать?
Спасибо за ответы!