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

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

  1. Чтобы запросить разницу напрямую, как SELECT (column_1 - column_2) as 'DIFFERENCE' FROM 'Table_Name'
  2. Чтобы иметь триггер UPDATE, который автоматически обновляет фиксированный столбец «разница», чтобы я мог просто запроситьНепосредственно столбец различий

Как я упоминал ранее, я буду запрашивать потенциально десятки тысяч записей, поэтому, возможно, вариант 1 будет представлять некоторую перегрузку, тогда как вариант 2 будет выполнять вычитание только при необходимости.

Я не эксперт по оптимизации производительности баз данных, поэтому, может быть, мне чего-то не хватает, на что мог бы указать кто-то с большим опытом.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Если ваша версия MySQL / MariaDB не имеет «сгенерированных столбцов», то не беспокойтесь о предварительном вычислении разницы.Стоимость и сложность триггера (или чего-либо еще) намного превышают просто пересчет разницы в каждом SELECT, который в этом нуждается.GENERATED VIRTUAL - это, вероятно, просто причудливый способ изменить ситуацию на лету.

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

0 голосов
/ 02 февраля 2019

Альтернативой может быть 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 .

...