Mysql查詢索引優(yōu)化實例

單表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;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容