單表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) 可以建索引,觸發(fā)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 '創(chuàng)建時間',
? 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;