为了账号安全,请及时绑定邮箱和手机立即绑定

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;



作者:会写bug的鸟
链接:https://www.jianshu.com/p/d4154cb46e01

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消