gpt4 book ai didi

MySql 索引和查询优化及最短执行时间

转载 作者:行者123 更新时间:2023-11-29 02:49:38 27 4
gpt4 key购买 nike

目前我正在处理大约 600K 的记录,下面的查询需要大约 6.5 秒 的时间来获取结果。

有人能帮我把执行时间缩短到 2-3 秒吗?

查询 1:

SELECT  DATE_FORMAT(`LS_CHG_DTE_OCR`, '%Y-%b') AS fmt_date, SUM(connects) AS connects,
SUM(disconnects) AS disconnects, ROUND(SUM(REV),0) AS REV
FROM
( SELECT LS_CHG_DTE_OCR,
IF(`TYPE`='Connect',COUNT(DISTINCT ORDER_NO_OHI), 0) AS connects,
IF(`TYPE`='Disconnect',COUNT(DISTINCT ORDER_NO_OHI), 0) AS disconnects,
IF(`TYPE`='Upgrade',COUNT(DISTINCT ORDER_NO_OHI), 0) AS Upgrades,
IF(`TYPE`='Downgrades',COUNT(DISTINCT ORDER_NO_OHI), 0) AS Downgrades,
SUM(IF(`TYPE`='Connect',REV,0)) AS REV
FROM hsd_26_05_2016
WHERE LS_CHG_DTE_OCR!=''
GROUP BY LS_CHG_DTE_OCR,TYPE
) AS a
GROUP BY YEAR(LS_CHG_DTE_OCR), MONTH(LS_CHG_DTE_OCR)
ORDER BY LS_CHG_DTE_OCR ASC;

查询 2:

 CREATE TABLE `hsd_26_05_2016` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`SYS_OCR` varchar(255) DEFAULT NULL,
`PRIN_OCR` varchar(255) DEFAULT NULL,
`ORDER_NO_OHI` varchar(255) NOT NULL,
`SUB_ACCT_NO_OHI` varchar(255) DEFAULT NULL,
`SERV_CDE_OHI` varchar(255) DEFAULT NULL,
`DSC_CDE_OHI` varchar(255) DEFAULT NULL,
`LS_CHG_DTE_OCR` date NOT NULL,
`SALESREP_OCR` varchar(255) DEFAULT NULL,
`CHANNEL` varchar(255) DEFAULT NULL,
`CUST_TYPE` varchar(255) DEFAULT NULL,
`LINE_BUS` varchar(255) DEFAULT NULL,
`ADDR1_HSE` varchar(255) DEFAULT NULL,
`RES_CITY_HSE` varchar(255) DEFAULT NULL,
`RES_STATE_HSE` varchar(255) DEFAULT NULL,
`POSTAL_CDE_HSE` varchar(255) DEFAULT NULL,
`ZIP` varchar(10) DEFAULT NULL,
`COUNT_SUBS` double DEFAULT NULL,
`REV` double NOT NULL,
`TYPE` varchar(255) NOT NULL,
`SERVICECATEGORY` varchar(200) DEFAULT NULL,
`lat` varchar(100) DEFAULT NULL,
`long` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`,`LS_CHG_DTE_OCR`,`TYPE`,`ORDER_NO_OHI`),
KEY `idx2` (`CHANNEL`,`CUST_TYPE`,`LINE_BUS`),
KEY `idx1` (`RES_STATE_HSE`,`RES_CITY_HSE`,`ZIP`)
) ENGINE=InnoDB AUTO_INCREMENT=1134054 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC

如果索引中有任何建议,请给我建议。感谢您的帮助。

最佳答案

首先按日期和类型“计数不同”,然后对这些计数求和?这似乎是“错误的”。如果您想要一个月的“唯一性”,则无法通过对这些天求和来获得它。

这确实 2 次传递了数据;我认为一个就足够了。

考虑 GROUP BY LEFT(LS_CHG_DTE_OCR, 7)

当该值不可用时,不要使用 ORDER BY LS_CHG_DTE_OCR ASC。相反,使用与 GROUP BY 中相同的值。

如果不是DISTINCT,很容易建立一个“汇总表”,从而提高效率。然而,this blog解释了“uniques”是如何被汇总的,尽管通常有 1% 的误差。这“足够好”了吗?

关于MySql 索引和查询优化及最短执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37563445/

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