mysql中sql语句优化之添加覆盖索引优化流程步骤
我们常说的sql性能优化中的索引优化大部分都是说覆盖索引
进入正题分析
表结构
CREATE TABLE `NewsList` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` char(200) DEFAULT NULL,
`bankid` int(11) DEFAULT NULL COMMENT '银行id 优惠对象',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `bankid` (`bankid`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=411808 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
41万数据
测试一个简单的sql查询语句
select title from NewsList where bankid=1 order by created_at asc limit 10;
查询时间:
> OK
> 时间: 7.731s
用EXPLAIN跑一下
从EXPLAIN的结果可以看出,查询已经使用了索引,但为什么还这么慢?
分析:
首先,该语句ORDER BY 使用了Using filesort文件排序,查询效率低;
其次,查询字段不在索引上,没有使用覆盖索引,需要通过索引回表查询;
当然,也有数据分布的原因。
解决方案:
由于只需查询title字段,添加一个联合索引便可以避免回表和文件排序,
利用覆盖索引提升查询速度,同时利用索引完成排序。
添加覆盖索引:我这里直接用navicat工具添加
覆盖索引:
sql只需要通过索引就可以返回查询所需要的数据,
而不必通过二级索引查到主键之后再去查询数据。
我们再用EXPLAIN跑一下:
在用上面的sql语句查询一下
> OK
> 时间: 0.011s
Extra信息已经有'Using Index',表示已经使用了覆盖索引。
经过索引优化之后,线上的查询基本不超过0.01秒。
完
相关文章