Как бы вы выполнили эту задачу, чтобы получить максимальную производительность?
Схема таблицы:
CREATE TABLE `test_truck_report` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`truck_id` INT(11) NOT NULL,
`odometer_initial` INT(11) NOT NULL,
`odometer_final` INT(11) NOT NULL,
`fuel_initial` INT(11) NOT NULL,
`fuel_final` INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB;
Я пытаюсь выполнить этот запрос:
SELECT
truck_id,
(odometer_final - odometer_initial) AS mileage,
(fuel_initial - fuel_final) AS consumed_fuel,
(consumed_fuel / mileage) AS consumption_per_km
FROM
test_truck_report
WHERE
consumption_per_km > 2
Почему-то эта очевидная на первый взгляд логика не работает, и вместо этого я вынужден использовать этот запрос:
SELECT
truck_id,
(odometer_final - odometer_initial) AS mileage,
(fuel_initial - fuel_final) AS consumed_fuel,
((fuel_initial - fuel_final) / (odometer_final - odometer_initial)) AS consumption_per_km
FROM
test_truck_report
WHERE
((fuel_initial - fuel_final) / (odometer_final - odometer_initial)) > 2
Я предполагаю, что постоянный пересчет каждого вычисляемого поля каждый раз, когда его нужно разместить, приводит к значительному снижению производительности. И это всего лишь тестовый пример, реальная рабочая таблица имеет более 50 полей, а некоторые из вычисляемых полей состоят из более чем 10 операндов. Так что это действительно ОГРОМНАЯ проблема на данный момент.
Причина, по которой я не хочу создавать эти поля и выполнять что-то вроде:
UPDATE
`test_truck_report`
SET
consumed_fuel = fuel_initial - fuel_final
заключается в том, что существующие записи постоянно обновляются пользователями, и в этом случае мне нужно будет постоянно обновлять эти данные. Итак, вы считаете создание реальных полей лучшей идеей? Или есть лучший способ?
Спасибо.
HAVING
для операторовSELECT
. Здесь используются имена столбцов и вычисляемые значения. - person Linus Kleen   schedule 19.01.2015