簡體   English   中英

如何使用子字符串加快此SQL查詢的速度?

[英]How can I speed up this sql query with substring?

有沒有辦法加快此工作查詢的速度?

我的數據庫中有4個表(Area,APeriod,Data,Item)。 它們的設置如下[column_name(帶有示例)]:

區域[區域代碼(A102)] [區域名稱(費城-威明頓-大西洋城,PA-NJ-DE-MD)

APeriod [期間(M01)] [period_abbr(JAN)] [period_name(1月)]

項目[item_code(701322)] [item_name(意大利面和通心粉,每磅453.6克)]

數據[series_id] [年份(1995)] [期間(M01)] [值(0.235)] [腳注代碼]

查詢描述-確定Miami-FT中每磅沙朗牛排[703611]與紅,白葡萄酒桌(所有尺寸,任何來源;每1升)[702311]的價格比。 從1995年到現在,勞德代爾地區按月匯總,按年分別匯總。

查詢代碼:

SELECT main.year, APeriod.period_name, steak.value AS Steak, wine.value AS Wine, steak.value/wine.value AS Ratio
FROM
(SELECT DISTINCT year, period FROM Data) main 
INNER JOIN APeriod ON main.period = APeriod.period
LEFT OUTER JOIN Data steak ON steak.series_id ='APU0100703611' AND main.year=steak.year AND main.period=steak.period
LEFT OUTER JOIN Data wine ON wine.series_id ='APU0400720311' AND main.year=wine.year AND main.period=wine.period
ORDER BY main.year, main.period

此查詢有效,但MySQL服務器平均需要129秒才能運行此查詢(有人告訴我這很長)。 退貨示例

[顯示第0-24行(共209行,查詢用時137.6224秒。)[年份:1995-1997]

年period_name牛排酒的比例

1995年1月3.593 NULL NULL
1995年2月3.510 NULL NULL
1995年3月3.708 NULL NULL
1995年4月3.747 NULL NULL
1995年5月3.462 NULL NULL
1995年6月3.742 NULL NULL
1995年7月3.686 4.661 0.7908174
1995年8月3.823 3.978 0.9610357
1995年9月3.625 4.580 0.7914847
1995年10月3.795 4.042 0.9388916
1995年11月3.509 4.760 0.7371849
1995年12月3.315 4.056 0.8173077
(無法正確插入圖片,抱歉)

我嘗試使用子字符串並創建視圖來幫助加快速度,但是遇到了其他錯誤,這使我相信我做錯了什么,因為我是sql的新手。 有沒有辦法加快速度? 如果是這樣,請告訴我。 提前致謝。

這是您的查詢:

SELECT main.year, APeriod.period_name, steak.value AS Steak, wine.value AS Wine,
       steak.value/wine.value AS Ratio
FROM (SELECT DISTINCT year, period FROM Data) main INNER JOIN
     APeriod
     ON main.period = APeriod.period LEFT OUTER JOIN
     Data steak
     ON steak.series_id ='APU0100703611' AND
        main.year=steak.year AND
        main.period=steak.period LEFT OUTER JOIN
     Data wine
     ON wine.series_id ='APU0400720311' AND
        main.year=wine.year AND
        main.period=wine.period
ORDER BY main.year, main.period;

索引應該有很大幫助。 我會建議:

create index idx_data_year_period_series on data(year, period, seies);
create index idx_aperiod_period on aperiod(period);

如果將aperiod.period聲明為主鍵或唯一鍵,則其中的第二個(在aperiod.period )已經存在。

暫無
暫無

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

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