Mysql性能优化案例-覆盖索引分享
来源:互联网 发布:epud阅读器 mac 编辑:程序博客网 时间:2024/05/20 13:04
场景
产品中有一张图片表,数据量将近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,提高了效率
覆盖索引得名于它满足了查询中给定表用到的所有的列。想要创建一个覆盖索引,这个索引必须包含指定表上包括WHERE语句、ORDER BY语句、GROUP BY语句(如果有的话)以及SELECT语句中的所有列。
例如上面的sql,查询条件是user_id,可以使用联合索引,要查询的字段是picname smallimg,这两个字段也在联合索引中,这就实现了“覆盖索引”,可以根据这个联合索引一次性完成查询工作,所以提升了性能
- Mysql性能优化案例-覆盖索引分享
- Mysql性能优化案例研究 - 覆盖索引和SQL_NO_CACHE
- 【MySQL】性能优化之 覆盖索引
- 【MySQL】性能优化之 覆盖索引
- Mysql性能优化案例
- MySQL性能优化---索引
- Mysql性能优化-索引
- MySQL索引优化——覆盖索引
- mysql 索引优化案例(索引失效)
- mysql性能优化(八) mysql索引优化
- MySQL SQL优化之覆盖索引
- MySQL SQL优化之覆盖索引
- MySQL性能优化-关于索引
- MySQL索引和性能优化
- Mysql性能优化之索引
- MYSQL性能优化分享(分库分表)
- MYSQL性能优化分享(分库分表)
- MySQL性能优化经验分享
- 机器学习(1)
- Java常用类
- android线程管理二(Thread)
- JavaScript之Object原型方法
- POJ 3667 hotel (线段树)(第三部分 区间合并)
- Mysql性能优化案例-覆盖索引分享
- Linux-XX-Net
- android 安装app 出现 pkg: /data/local/tmp/com.ksd.carcloud Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE
- String类
- Qt:QML与C++混合编程详解
- startService()和bindService()区别
- chaojitaijie
- 给全景添加动态热点
- 2017模拟面试题库 —— C++相关