Mysql性能优化案例 - 覆盖索引分享
2016-03-10 12:48
661 查看
场景
产品中有一张图片表,数据量将近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性能全面优化方法参考,从CPU,文件系统选择到mysql.cnf参数优化
- MySQL性能优化的最佳20+条经验
- mysql性能优化工具--tuner-primer使用介绍
- 数据库Mysql性能优化详解
- MySQL性能参数详解之Skip-External-Locking参数介绍
- MySQL性能参数详解之Max_connect_errors 使用介绍
- MySQL性能瓶颈排查定位实例详解
- Mysql性能优化方案分享
- Mysql性能优化案例研究-覆盖索引和SQL_NO_CACHE
- mysql性能优化之索引优化
- MySQL性能监控软件Nagios的安装及配置教程
- 19个MySQL性能优化要点解析
- 详解MySQL性能优化(二)
- 详解MySQL性能优化(一)
- 10个MySQL性能调优的方法
- 浅谈InnoDB隔离模式的使用对MySQL性能造成的影响
- 使用FriendFeed来提升MySQL性能的方法
- my.cnf(my.ini)重要参数优化配置说明
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- 深入理解PHP7内核之FAST_ZPP
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜