MYSQL - 如何为 group by/order by/sum/with where 添加索引

标签 mysql optimization indexing

我正在处理一个包含 40K 行的 mysql 表。当前执行时间约为 2 秒,表已建立索引。有人可以指导我如何更好地优化此查询和表吗?以及如何摆脱“使用位置;使用临时;使用文件排序”??如有任何帮助,我们将不胜感激。

以下情况下使用 be 进行分组...

  1. LS_CHG_DTE_OCR
  2. LS_CHG_DTE_OCR/RES_STATE_HSE
  3. LS_CHG_DTE_OCR/RES_STATE_HSE/RES_CITY_HSE
  4. LS_CHG_DTE_OCR/RES_STATE_HSE/RES_CITY_HSE/POSTAL_CDE_HSE

提前致谢

SELECT DATE_FORMAT(`LS_CHG_DTE_OCR`, '%Y-%b') AS fmt_date, 
    SUM(IF(`TYPE`='Connect',COUNT_SUBS,0)) AS connects, 
    SUM(IF(`TYPE`='Disconnect',COUNT_SUBS,0)) AS disconnects,
    SUM(IF(`TYPE`='Connect',ROUND(REV,2),0)) AS REV, 
    SUM(IF(`TYPE`='Upgrade',COUNT_SUBS,0)) AS upgrades, 
    SUM(IF(`TYPE`='Downgrade',COUNT_SUBS,0)) AS downgrades,
    SUM(IF(`TYPE`='Upgrade',ROUND(REV,2),0)) AS upgradeRev FROM `hsd`
    WHERE LS_CHG_DTE_OCR!='' GROUP BY MONTH(LS_CHG_DTE_OCR) ORDER BY LS_CHG_DTE_OCR ASC



CREATE TABLE `hsd` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `SYS_OCR` varchar(255) DEFAULT NULL,
  `PRIN_OCR` varchar(255) DEFAULT NULL,
  `SERV_CDE_OHI` varchar(255) DEFAULT NULL,
  `DSC_CDE_OHI` varchar(255) DEFAULT NULL,
  `LS_CHG_DTE_OCR` datetime DEFAULT 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(100) DEFAULT NULL,
  `COUNT_SUBS` double DEFAULT NULL,
  `REV` double DEFAULT NULL,
  `TYPE` varchar(255) DEFAULT NULL,
  `lat` varchar(100) DEFAULT NULL,
  `long` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx` (`LS_CHG_DTE_OCR`,`CHANNEL`,`CUST_TYPE`,`LINE_BUS`,`RES_CITY_HSE`,`RES_STATE_HSE`,`POSTAL_CDE_HSE`,`ZIP`,`COUNT_SUBS`,`TYPE`)
) ENGINE=InnoDB AUTO_INCREMENT=402342 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC


Using where; Using temporary; Using filesort[enter image description here][1]

最佳答案

您应用的唯一条件是 LS_CHG_DTE_OCR != ""。除此之外,由于聚合,您正在执行全表扫描。就索引而言,您在这里不能做太多事情。

我也遇到了同样的问题。我已经完全优化了我的查询(我有联接和更多条件),但表不断增长,查询时间也随之增长。最后我决定将数据镜像到ElasticSearch。就我而言,它将查询时间减少到大约 1/20 到 1/100(对于不同的查询)。

关于MYSQL - 如何为 group by/order by/sum/with where 添加索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37131424/

相关文章:

php - 根据所选月份动态显示 SQL COUNT

mysqlcheck with --optimize 但仅适用于 MyISAM 表

php - 具有多个leftjoin的Mysql

mysql - 如何在 MySQL 中编写优化查询?

mysql - Sphinx 索引器“无错误”错误

sql - 死锁使用自引用外键

python - 在 Python(还有 MySQL)中使用 C/C++ 进行繁重的计算

php - 我如何使用 php 处理大的 mysql 表进行登录验证

arrays - 创建具有固定计数的 Swift Array<Float> 的最快方法

matlab - 计算矩阵中值的唯一组合数