簡體   English   中英

MySQL計算字段在SELECT子句中的重用

[英]MySQL calculated fields reuse in SELECT clause

您將如何完成這項任務以獲得最佳性能?

表架構:

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;

現在,您可以隨時以簡單易懂的方式查詢:

SELECT *
  FROM vw_truck_consumption 
 WHERE consumption_per_km > 2

這樣,MySQL應該只能減去每個字段一次,因此性能至少應與您的解決方案一樣好或更高。 通常,添加字段所產生的CPU開銷要小於從數據庫檢索數據所花費的開銷,但是當然,這取決於您的硬件,mysql版本,配置和數據分布。 如果確實有問題,請進行一些測量。

無論如何,請記住,您正在按consumption_per_km進行查詢過濾,這是字段的功能。 由於MySQL似乎缺少功能性索引,因此它肯定會掃描整個表並且速度很慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM