gpt4 book ai didi

mysql - 如何使用子字符串加速此 sql 查询?

转载 作者:行者123 更新时间:2023-11-29 23:21:07 25 4
gpt4 key购买 nike

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

我的数据库中有 4 个表(Area、APeriod、Data、Item)。它们的设置如下[column_name(带示例)]:

区域 [区域代码 (A102)] [区域名称(费城-威尔明顿-大西洋城,宾夕法尼亚州-新泽西州-DE-马里兰州]

APeriod [期间 (M01)] [期间_缩写 (一月)] [期间_名称 (一月)]

商品[商品代码 (701322)] [商品名称(意大利面条和通心粉,每磅 453.6 克)]

数据 [series_id] [年份 (1995)] [期间 (M01)] [值 (0.235)] [footnote_codes]

查询描述 - 确定《迈阿密金融时报》中每磅牛排沙朗 [703611] 与 Wine 、红白餐 table (所有尺寸、任何产地;每 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
(无法正确插入图片,抱歉)

我尝试获取子字符串并创建一个 View 来帮助加快速度,但遇到了其他错误,这让我相信我做错了什么,因为我是 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 上)已经存在。

关于mysql - 如何使用子字符串加速此 sql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27285334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com