很多时候我们需要查询类似于所有人做题量之类的查询,一般第一时间想到的会是group by 加count,这个在数据量不大的情况下还没问题,但数据达到百万级别就会是很大的问题,因为group by的字段如果过多会出现索引失效,例如以下例子:

* 该表主要为了给大家看个结构,有删减

CREATE TABLE `practice_answer_log` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`u_id` int(11) unsigned DEFAULT 0 COMMENT '用户id',`first_id` int(10) unsigned DEFAULT 0 COMMENT '一级栏目ID',`istrue` tinyint(1) DEFAULT 0 COMMENT '是否答对 1是0否',PRIMARY KEY (`id`),KEY `u_id` (`u_id`),KEY `istrue` (`istrue`) USING HASH,KEY `first_id_btree` (`first_id`) USING BTREE,KEY `u_id_4` (`u_id`,`first_id`),KEY `first_id` (`first_id`,`istrue`),KEY `u_id_2` (`u_id`,`istrue`),KEY `u_id_3` (`u_id`,`first_id`,`istrue`)
) ENGINE=InnoDB AUTO_INCREMENT=6790746 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='所有练习记录表';

当执行下面的这句group by 时消耗约40s,explain发现因为是查询所有人的数据,u_id索引失效,相关联合索引也无效

SELECT count(*) AS `t_count`,`u_id` FROM `practice_answer_log` WHERE  `istrue` = 1 GROUP BY `u_id` 

当我们改为子查询以下形式,已经快了n倍,从explain也可以看出走了联合索引

select id,(SELECT count(*) AS `t_count` FROM `practice_answer_log` WHERE  `istrue` = 1 and u_id = user.id) cnt from user

一点小经验希望对大家有用

mysql关于group by加count的优化相关推荐

  1. MySQL高级- group by ,order by 索引优化

    一:索引失效 1. 2.最佳左前缀法则 4. 8. 使用覆盖索引解决这个问题. 二.索引优化 1.ORDER BY 子句,尽量使用Index方式排序,避免使用FileSort方式排序 MySQL支持两 ...

  2. mysql的count(*)的优化,获取千万级数据表的总行数

    一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径,选择了用explain来获取总行数. 二.关于cou ...

  3. mysql innodb count_MySQL下INNODB引擎的SELECT COUNT(*)性能优化及思考

    正 文: MySQL下INNODB引擎的SELECT COUNT(*)性能优化及思考 最近有项目有高并发需求,服务器采用负载均衡,数据库采用阿里云的RDS MYSQL,16核64G内存,连接数:160 ...

  4. mysql 亿级表count_码云社 | 砺锋科技-MySQL的count(*)的优化,获取千万级数据表的总行数 - 用代码改变世界...

    专注于Java领域优质技术号,欢迎关注 作者:李长念 一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径 ...

  5. MySQL 的 count(*) 的优化,获取千万级数据表的总行数

    一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径,选择了用explain来获取总行数. 二.关于cou ...

  6. mysql 5.622_新特新解读 | MySQL 8.0 对 count(*)的优化

    我们知道,MySQL 一直依赖对 count(*) 的执行很头疼.很早的时候,MyISAM 引擎自带计数器,可以秒回:不过 InnoDB 就需要实时计算,所以很头疼.以前有多方法可以变相解决此类问题, ...

  7. mysql count 百万级_MySQL 的 count(*) 的优化,获取千万级数据表的总行数

    一.前言 二.关于count的优化 三.使用explain获取行数1.关于explain 2.关于返回值 一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(* ...

  8. MySQL COUNT函数优化及count(1)/count(*)/count(列名)的区别

    count函数优化 使用近似值: 在某些应用场景中,不需要完全精确的值,可以参考使用近似值来代替,比如可以使用explain来获取近似的值.其实在很多OLAP的应用中,需要计算某一个列值的基数,有一个 ...

  9. Mysql中慢SQL的分析与优化

    为何对慢SQL进行治理 从数据库角度看:每个SQL执行都需要消耗一定I/O资源,SQL执行的快慢,决定资源被占用时间的长短.假设总资源是100,有一条慢SQL占用了30的资源共计1分钟.那么在这1分钟 ...

最新文章

  1. Spark SQL中 RDD 转换到 DataFrame (方法二)
  2. 普渡大学计算机硕士申请条件,普渡大学CS硕士申请需要哪些条件?未来的就业前景全面解析...
  3. 冷静对待你遇到的所有Java内存异常
  4. SAP JAM的推荐菜单,书签和日历功能
  5. 如何在Marketing Cloud Launchpad里创建新的tile
  6. python开发pandas_二、Python开发---33、pandas(1)
  7. 重磅!英特尔终于挤出10nm芯片 六大技术战略,震动芯片届
  8. 如何抓取html请求,怎么获取请求头
  9. 安全狗导致php错误,服务器安全狗导致ASP.NET网站运行出错的一个案例
  10. 2021-2025年中国充气救生衣行业市场供需与战略研究报告
  11. 【BZOJ2655】—calc(拉格朗日插值+生成函数+dp)
  12. java textarea 自动滚动条_月光软件站 - 编程文档 - Java - 如何实现滚动条的自动滚动到textarea的末尾...
  13. pandas读取excel遇见空值的处理
  14. 我对“渗透性测试”的理解
  15. 【RocketMQ】发送事务消息
  16. 目前很穷,有什么办法能快速挣钱?
  17. 一些国外的MD5破解网站
  18. 【一点唐城】15个未来高科技产品会让你无法想象、这些开脑洞的设计太牛了
  19. 做短视频剪辑的两种配音方法
  20. 基于struts+spring+ibatis的轻量级J2EE开发

热门文章

  1. 云计算运维累不累_云计算运维工程师能做到老吗
  2. 【Code pratice】——排他平方数
  3. csv文件加bom python_CSV读取与写入的常见问题(空行、BOM、r/w/a模式、指针)
  4. ImageNet1000类目标
  5. 股票收益matlab仿真,MATLAB股票量化交易系统 - 2018.11.11系统选股得分前五股票收益报表...
  6. 机器学习面试题之——LR问题集合
  7. java中elapseTime设置新时间,Jmeter系列(44)- 详解 Elapsed time、Latency、Connect Time的含义...
  8. 图片识别转公式,GitHub 又一 LaTeX 神器面世
  9. 合肥学院计算机考研资料汇总
  10. 一个合格的初级程序员所应该具备的能力