场景
产品中有一张图片表,数据量将近100万条,有一条相关的查询语句,由于执行频次较高,想针对此语句进行优化
表结构很简单,主要字段:
复制代码 代码如下:
user_id 用户ID
picname 图片名称
smallimg 小图名称
一个用户会有多条图片记录
现在有一个根据user_id建立的索引:uid
查询语句也很简单:取得某用户的图片集合
复制代码 代码如下:
select picname, smallimg
from pics where user_id = xxx;
优化前
执行查询语句(为了查看真实执行时间,强制不使用缓存)
复制代码 代码如下:
select SQL_NO_CACHE picname, smallimg
from pics where user_id=17853;
执行了10次,平均耗时在40ms左右
使用explain进行分析
复制代码 代码如下:
explain select SQL_NO_CACHE picname, smallimg
from pics where user_id=17853
使用了user_id的索引,并且是const常数查找,表示性能已经很好了
优化后
因为这个语句太简单,sql本身没有什么优化空间,就考虑了索引
修改索引结构,建立一个(user_id,picname,smallimg)的联合索引:uid_pic
重新执行10次,平均耗时降到了30ms左右
使用explain进行分析
看到使用的索引变成了刚刚建立的联合索引,并且Extra部分显示使用了'Using Index'
总结
'Using Index'的意思是“覆盖索引”,它是使上面sql性能提升的关键
一个包含查询所需字段的索引称为“覆盖索引”
MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提高了效率
例如上面的sql,查询条件是user_id,可以使用联合索引,要查询的字段是picname smallimg,这两个字段也在联合索引中,这就实现了“覆盖索引”,可以根据这个联合索引一次性完成查询工作,所以提升了性能
Mysql,性能优化,覆盖索引
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]