Запрос математических операций против использования триггера обновления для фиксированного столбца в базе данных mysql
У меня есть таблица с двумя числовыми значениями, и я буду запрашивать разницу между этими двумя значениями по тысячам записей. У меня есть две альтернативы:
- Чтобы запросить разницу прямо как
SELECT (column_1 - column_2) as 'DIFFERENCE' FROM 'Table_Name'
- Иметь триггер UPDATE, который автоматически обновляет фиксированный столбец "разница", чтобы я мог просто запросить столбец различия напрямую
Как я уже упоминал ранее, я буду запрашивать десятки тысяч записей, поэтому, возможно, вариант 1 будет представлять какую-то перегрузку, тогда как вариант 2 будет выполнять вычитание только при необходимости.
Я не эксперт по оптимизации производительности баз данных, поэтому, может быть, мне чего-то не хватает, на что мог бы указать кто-то с большим опытом.
Заранее спасибо.
2 ответа
Альтернативой будет generated column
например
ALTER TABLE table_name ADD difference GENERATED ALWAYS AS (column_1 - column_2)
Вы можете добавитьSTORED
Ключевое слово до концаALTER TABLE
команда, чтобы убедиться, что значение вычисляется один раз (на INSERT
а также UPDATE
операции), или вы можете опустить его (или добавить VIRTUAL
ключевое слово), чтобы указать, что столбец должен быть вычислен при чтении. С помощью VIRTUAL
как ваш вариант 1; STORED
как ваш вариант 2.
Вот небольшая демоверсия сгенерированного столбца на dbfiddle.
Если ваша версия MySQL/MariaDB не имеет "сгенерированных столбцов", не пытайтесь предварительно вычислить разницу. Стоимость и сложность триггера (или чего-то еще) намного превышают просто пересчет разницы в каждом SELECT
это нужно GENERATED VIRTUAL
это, вероятно, просто модный способ сделать разницу на лету.
В общем, не беспокойтесь о стоимости любого выражения или вызова встроенной функции. Это незначительно по сравнению с попытками найти строку, проанализировать ее и т. Д.