作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个问题
EXPLAIN SELECT
GA,
mkt_cd,
mkt_name
FROM
(SELECT
SUM(GA) AS GA,
sales_data_mkt.mkt_cd,
sales_data_mkt.mkt_name
FROM
sales_data_mkt
WHERE sales_data_mkt.country_cd = 'USA'
AND activity_dt BETWEEN '2015-08-01'
AND '2015-08-31'
AND sales_data_mkt.mkt_cd IS NOT NULL
GROUP BY sales_data_mkt.mkt_cd
ORDER BY (SUM(GA)) DESC) AS innerQuery
WHERE GA > 0
LIMIT 10
我有一个索引country_cd、activity_dt、mkt_cd
explain 语句返回这个:
使用的 key :
country_cd, activity_dt, mkt_cd
key_len:
12ref:
常量
行数:
909518
额外:
使用索引条件;在哪里使用;使用临时的;使用文件排序
此查询需要大约 5 秒才能返回具有 200 万行的表。根据我过去的阅读,Using temporary 和 Using filesort
对性能不利。我怎样才能微调这个查询?
这是创建语句
CREATE TABLE `sales_data_mkt` (
`ACTIVITY_DT` date DEFAULT NULL,
`Country_Cd` varchar(3) DEFAULT NULL,
`AREA_CD` char(2) DEFAULT NULL,
`AREA_DESC` varchar(30) DEFAULT NULL,
`REGION_CD` char(2) DEFAULT NULL,
`REGION_DESC` varchar(30) DEFAULT NULL,
`MKT_CD` char(4) DEFAULT NULL,
`MKT_NAME` varchar(30) DEFAULT NULL,
`device_tier` varchar(32) DEFAULT NULL,
`SLS_DIST_CHNL_TYPE_CD` char(3) DEFAULT NULL,
`PPlan_Type` varchar(14) DEFAULT NULL,
`PREPAID_IND` char(1) DEFAULT NULL,
`edge_taken_ind` varchar(1) DEFAULT NULL,
`Edge_Desc` varchar(16) DEFAULT NULL,
`Data_Plan_Tier` varchar(26) DEFAULT NULL,
`Unlimited_to_Others_cnt` int(11) DEFAULT NULL,
`Data_Step_UP_Cnt` int(11) DEFAULT NULL,
`Data_Step_Down_Cnt` int(11) DEFAULT NULL,
`lines` int(11) DEFAULT NULL,
`GA` int(11) DEFAULT NULL,
`DE` int(11) DEFAULT NULL,
`NetAdd` int(11) DEFAULT NULL,
`VOL_DE` int(11) DEFAULT NULL,
`INVOL_DE` int(11) DEFAULT NULL,
`PortIn_ATT_Leap` int(11) DEFAULT NULL,
`PortIn_Sprint_Nextel` int(11) DEFAULT NULL,
`PortIn_TMobile_MetroPcs` int(11) DEFAULT NULL,
`PortIn_OtherCarriers` int(11) DEFAULT NULL,
`PortOut_ATT_Leap` int(11) DEFAULT NULL,
`PortOut_Sprint_Nextel` int(11) DEFAULT NULL,
`PortOut_TMobile_MetroPcs` int(11) DEFAULT NULL,
`PortOut_OtherCarriers` int(11) DEFAULT NULL,
`Edge_Net_Sales` int(11) DEFAULT NULL,
`Edge_Eligible_Net_Sales` int(11) DEFAULT NULL,
`Edge_Net_Sales_All` int(11) DEFAULT NULL,
`Basic_To_Smart` int(11) DEFAULT NULL,
`AAL` int(11) DEFAULT NULL,
`New_To_VZ` int(11) DEFAULT NULL,
`Trade_In` int(11) DEFAULT NULL,
`Unlimited_to_Others` int(11) DEFAULT NULL,
`Data_Step_Up` int(11) DEFAULT NULL,
`Data_Step_Down` int(11) DEFAULT NULL,
KEY `MKT_CD` (`MKT_CD`,`ACTIVITY_DT`),
KEY `REGION_CD` (`REGION_CD`,`ACTIVITY_DT`,`MKT_CD`),
KEY `AREA_CD` (`AREA_CD`,`ACTIVITY_DT`),
KEY `Country_Cd` (`Country_Cd`,`ACTIVITY_DT`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
最佳答案
您不需要子查询,这个版本有帮助吗?
SELECT
SUM(GA) AS TotalGA,
sales_data_mkt.mkt_cd,
sales_data_mkt.mkt_name
FROM
sales_data_mkt
WHERE sales_data_mkt.country_cd = 'USA'
AND activity_dt BETWEEN '2015-08-01' AND '2015-08-31'
AND sales_data_mkt.mkt_cd IS NOT NULL
GROUP BY sales_data_mkt.mkt_cd
HAVING TotalGA > 0
ORDER BY TotalGA DESC
LIMIT 10
;
即使不将 GA
重命名为 TotalGA
它也可能工作,这对我来说看起来是错误的并且可能存在问题。
旁注:如果 activity_dt 是 DATETIME 或 TIMESTAMP,则 BETWEEN 可能无法完全按照您的预期工作。
关于mysql - 如何改进此表的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257987/
我是一名优秀的程序员,十分优秀!