2015-01-19 3 views
0

최상의 성능을 얻으려면이 작업을 어떻게 수행 하시겠습니까?SELECT 절의 MySQL 계산 필드 재사용

테이블 스키마 :

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 

는 기존 레코드가 지속적으로 사용자가 업데이트되고 있으며,이 경우 내가 지속적으로 해당 업데이트 할 필요가 있다는 것입니다 데이터. 실제 필드를 만드는 것이 더 좋은 아이디어라고 생각하십니까? 아니면 더 좋은 방법이 있습니까?

감사합니다.

CREATE OR REPLACE VIEW vw_truck_data AS 
SELECT truck_id, 
     (odometer_final - odometer_initial) AS mileage, 
     (fuel_initial - fuel_final)   AS consumed_fuel 
FROM test_truck_report; 

그리고 마지막보기 : 당신이 쉽게 읽을 수에서 원할 때마다

이제
CREATE OR REPLACE VIEW vw_truck_consumption AS 
SELECT data.*, 
     (data.consumed_fuel/data.mileage) AS consumption_per_km 
FROM vw_truck_data data; 

당신이 조회 할 수 있습니다

우리는 보조보기가 필요합니다

+0

SELECT 문에 대한 [HAVING'] (http://dev.mysql.com/doc/refman/5.7/en/select.html) 절을보십시오. 이것은 열 이름과 "계산 된 값"을 사용합니다. –

답변

0

봅니다 뷰를 사용하는 방법 :

SELECT * 
    FROM vw_truck_consumption 
WHERE consumption_per_km > 2 

이렇게하면 MySQL은 각 필드를 한 번만 빼낼 수 있어야합니다. 따라서 성능이 최소한 솔루션보다 좋거나 더 좋아야합니다. 일반적으로 필드 추가로 인한 CPU 비용은 데이터베이스에서 데이터를 가져 오는 데 드는 비용보다 적지 만 물론 하드웨어, MySQL 버전, 구성 및 데이터 배포에 따라 다릅니다. 그것이 정말로 문제가된다면 몇 가지 측정을하십시오.

어쨌든 당신이 필드의 기능인 consuming_per_km로 필터링 쿼리를 만들고 있다는 것을 기억하십시오. MySQL은 lack funtional indexes으로 보이므로 확실하게 전체 테이블을 스캔하고 느려질 것입니다.