gpt4 book ai didi

mysql - 我搜索了一些试图加快 MySQL 查询速度的信息,发现了很多让我困惑的信息。似乎没有一个能解决我的问题

转载 作者:行者123 更新时间:2023-11-30 00:57:17 25 4
gpt4 key购买 nike

我有两个名为“标题”和“详细信息”的表。两个表都有一个 InvoiceNumber( double )列和一个 YearMonthCode(char4)列。

在标题表中有一列 LastChangedDate (char(10)),在详细信息表中有一列 ItemNumber (varchar(16)) 和 OrderedQty (integer)

在进一步讨论之前,我要说的是,这些表不是我设计的,除了添加或删除索引或存储过程之外,我无法更改它们。我不会将日期存储为字符串,但我必须以以下形式处理它 (mm-dd-yyyy)

表头约90万条记录,明细表约250万条记录年月代码列从 1301(2013 年 1 月)到 1312(2013 年 12 月)

我的查询的目标是返回指定商品在设定的最后日期范围内的总和(OrderedQty)。

这是我提出的查询,它确实返回了我需要的信息,但每个项目大约需要 30 秒到 45 秒,整个项目报告 600 到 100 个项目......

我把它作为存储过程GetItemTotal(在 itm varchar(16) 中,在 ymcode 中(char(4),在 SDate 日期中,在 EDate 日期中,输出总计 int)

Select sum(D.OrderedQty) into total 
FROM Header H use index (index_YMC)
Inner Join Detail D use index (index_YMC)
on H.invoicenumber = D.InvoiceNumber
AND H.YearMonthCode = D.YearMonthCode
Where H.YearMonthCode = ymcode
AND D.ItemNumber = itm
AND STR_TO_DATE(H.LastChangeDate,'%m/%d/%YYYY')
Between Sdate AND Edate;

我这样称呼这个过程:

Call GetItemTotal('6458-20115','1311', '2013-11-15', '2013-11-30', @total)

实际上这些都是变量,但我硬编码了测试值。

两个表在yearmonthcode 列上都有 PRIMARY 索引和index_YMC。

解释显示以下内容

id select_type table type possible_keys key       key_len ref   rows    extra

1 SIMPLE H ref Index_YMC Index_YMC 5 const 100408 Using where

1 SIMPLE D ALL Index_YMC null null null 2032249 Using where;
Using join buffer

我对数据库编程非常陌生,如果有人能给我一些关于如何使这个查询更快的想法,我将不胜感激。

最佳答案

如果您已经对全年的值进行求和(在临时表的总体中),那么我建议在您的临时表总体查询中添加另一列,派生如下:

sum(case when STR_TO_DATE(LastChangeDate,'%m/%d/%YYYY') Between Sdate AND Edate
then OrderedQty
end) as DateRangeTotal

这应该完全不需要 GetItemTotal 存储过程。

(您可能可以通过使用基于集合的操作而不是循环遍历 600 个项目来提高其余处理的效率,但这超出了问题的范围。)

关于mysql - 我搜索了一些试图加快 MySQL 查询速度的信息,发现了很多让我困惑的信息。似乎没有一个能解决我的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20447400/

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