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

У меня есть таблица с двумя числовыми значениями, и я буду запрашивать разницу между этими двумя значениями по тысячам записей. У меня есть две альтернативы:

  1. Чтобы запросить разницу прямо как SELECT (column_1 - column_2) as 'DIFFERENCE' FROM 'Table_Name'
  2. Иметь триггер 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 это, вероятно, просто модный способ сделать разницу на лету.

В общем, не беспокойтесь о стоимости любого выражения или вызова встроенной функции. Это незначительно по сравнению с попытками найти строку, проанализировать ее и т. Д.

Другие вопросы по тегам