如何使用子字符串加速此SQL查询?

时间:2014-12-04 02:37:12

标签: mysql sql phpmyadmin

有没有办法加快这个工作查询?

我的数据库中有4个表(区域,APeriod,数据,项目)。它们的设置如下[column_name(with example)]:

区域[area_code(A102)] [Area_name(费城 - 威尔明顿 - 大西洋城,PA-NJ-DE-MD)

APeriod [期间(M01)] [期间_abbr(JAN)] [期间名称(1月)]

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

数据[series_id] [年(1995年)] [期间(M01)] [价值(0.235)] [脚注_代码]

查询说明 - 确定每磅牛排牛腩[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]

year 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年Septemb 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的新手。有没有办法加快速度?如果是的话,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

这是您的查询:

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上)已经存在。