mysql关于group by加count的优化

很多时候我们需要查询类似于所有人做题量之类的查询,一般第一时间想到的会是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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值