mysql 查询 优化 实例,Mysql查询索引优化实例

单表240W+数据,原本的索引没有一个是对的,数据表后来被重构了。sql是这样的:SELECT sum(`reals`) AS dur, uid

FROM app_learn

WHERE `vtime` > 1527782399

GROUP BY uid  ORDER BY dur DESC,  八核16Gmysql运行时间3秒左右,每到早晨10点就cpu100%。

索引sql是这样的 alter table app_learn add index test(vtime,reals),sql运行时间0.1秒左右

简单分析一下,首先是innodb存储引擎,索引指向对主键的引用,故而group by uid这行不用加索引;其次sql只查两个字段,而且两个字段都是int字段,故而order by sum(reals) 可以建索引,触发innodb的索引覆盖;最后是where vtime> 的条件

CREATE TABLE `app_learn` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`uniqueid` bigint(20) NOT NULL DEFAULT '0' COMMENT '唯一id值',

`cid` int(11) DEFAULT '0' COMMENT '分类id',

`uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户id',

`rid` int(11) NOT NULL DEFAULT '0' COMMENT '音频id',

`current` int(11) DEFAULT '0' COMMENT '学习时长',

`reals` int(10) NOT NULL DEFAULT '0' COMMENT '真实学习时长',

`duration` int(11) DEFAULT '0' COMMENT '总时长',

`y` int(4) NOT NULL DEFAULT '0' COMMENT '年',

`m` int(2) NOT NULL DEFAULT '0' COMMENT '月',

`d` int(2) NOT NULL DEFAULT '0' COMMENT '日',

`w` int(5) NOT NULL DEFAULT '0' COMMENT '周',

`h` int(2) DEFAULT '0' COMMENT '小时',

`vtime` int(11) DEFAULT '0' COMMENT '创建时间',

PRIMARY KEY (`id`,`uid`,`rid`,`uniqueid`),

KEY `uniqueid` (`uniqueid`,`uid`,`rid`),

KEY `cid` (`cid`,`uid`),

KEY `cid_2` (`cid`,`rid`),

KEY `uid` (`uid`),

KEY `idx_rid` (`rid`)

) ENGINE=InnoDB AUTO_INCREMENT=2486599 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值