Mysql性能优化案例 - 覆盖索引分享
作者:mdxy-dxy 时间:2024-01-27 15:16:59
场景
产品中有一张图片表,数据量将近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,性能优化,覆盖索引
0
投稿
猜你喜欢
python之语句mode = 'test' if y is None else 'train'问题
2021-02-04 20:35:17
CodeIgniter分页类pagination使用方法示例
2023-11-24 10:33:05
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2024-05-11 09:11:06
手把手教你使用Python绘制时间序列图
2021-08-04 14:32:07
彻底弄懂CSS盒子模式之一(DIV布局快速入门)
2007-05-11 17:03:00
python多进程使用apply_async的使用方法详解
2022-11-14 16:08:50
一文教你利用Python画花样图
2023-09-01 20:26:42
python3获取当前文件的上一级目录实例
2021-06-03 02:22:22
关于python多重赋值的小问题
2023-08-04 06:38:16
Bootstrap table分页问题汇总
2024-04-29 13:12:07
web.py 十分钟创建简易博客实现代码
2022-10-23 00:55:38
长文章自动分页asp实例-支持HTML
2007-10-10 21:29:00
现代 javscript 编程
2011-04-21 16:24:00
Python fileinput模块使用介绍
2023-08-22 14:32:12
飞扬远程获取类Asp xmlHttp 源码
2010-04-03 20:37:00
交互设计的方法
2010-08-18 12:32:00
PHP cron中的批处理
2024-05-11 09:45:39
将字典转换为DataFrame并进行频次统计的方法
2023-11-21 05:37:30
Flask和pyecharts实现动态数据可视化
2022-06-15 04:21:20
axios接口管理优化操作详解
2024-04-30 10:28:09