繁華開滿天機(jī)
2019-03-06 14:19:19
有如下結(jié)構(gòu)的MySQL 表
CREATE TABLE `t_article` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`content` varchar(255) NOT NULL COMMENT '內(nèi)容',
`like_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '點(diǎn)贊數(shù)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='文章表';
插入數(shù)據(jù):
INSERT INTO `t_article` (`id`, `content`, `like_count`) VALUES ('1', 'aaa', '4');
INSERT INTO `t_article` (`id`, `content`, `like_count`) VALUES ('2', 'rrrr', '53');
INSERT INTO `t_article` (`id`, `content`, `like_count`) VALUES ('3', 'ttt', '7');
INSERT INTO `t_article` (`id`, `content`, `like_count`) VALUES ('4', 'rree', '6');
INSERT INTO `t_article` (`id`, `content`, `like_count`) VALUES ('5', 'rrr', '888');
需求是查詢文章列表,根據(jù)點(diǎn)贊數(shù)(like_count)字段從大到小排序,SQL 語(yǔ)句如下:
SELECT id FROM t_article ORDER BY like_count DESC LIMIT 0,4;
怎么建立索引才合理,問(wèn)題原由是看了很多大佬文章都會(huì)說(shuō)索引字段不應(yīng)該頻繁更新,但是 like_count 這個(gè)字段肯定是經(jīng)常更新的,
另外還有個(gè)衍生問(wèn)題,如下SQL 執(zhí)行的分析 type 為 index 有沒(méi)有毛病,這個(gè)SQL沒(méi)有用 where 條件,沒(méi)有用 排序字段,但是還是會(huì)進(jìn)行全表掃描,又該怎么優(yōu)化呢
SELECT id FROM t_article LIMIT 0,4;
EXPLAIN 分析
3 回答

縹緲止盈
TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
首先 你可以考慮下你這樣的表是否有問(wèn)題?只記錄點(diǎn)贊數(shù)你如何保證每個(gè)用戶只點(diǎn)贊一次?
好吧 我們假設(shè)你有另外一個(gè)點(diǎn)贊表 然后這里也同步更新好了 那么它是否適合做索引?
那就取決于你對(duì)這個(gè)查詢到底有多頻繁?如果頻繁查詢還是要建索引的,哪怕頻繁更新對(duì)索引維護(hù)有一定影響(其實(shí)有change_buffer在效率也還好啦)
最后你的那個(gè)SQL語(yǔ)句用的是聚集索引,也就是主鍵的那個(gè)索引

UYOU
TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
SELECT id FROM t_article WHERE id > 10000 ORDER BY like_count DESC LIMIT 0,4;
只會(huì)走id上的索引,即使有id和like_count的聯(lián)合索引,也是忽略like_count列的索引了
- 3 回答
- 0 關(guān)注
- 542 瀏覽
添加回答
舉報(bào)
0/150
提交
取消