mysql中sql语句优化之添加覆盖索引优化流程步骤

2023-06-01 00:00:00 索引 语句 优化

我们常说的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跑一下

1.png

从EXPLAIN的结果可以看出,查询已经使用了索引,但为什么还这么慢?


分析:

首先,该语句ORDER BY 使用了Using filesort文件排序,查询效率低;

其次,查询字段不在索引上,没有使用覆盖索引,需要通过索引回表查询;

当然,也有数据分布的原因。


解决方案:

由于只需查询title字段,添加一个联合索引便可以避免回表和文件排序,

利用覆盖索引提升查询速度,同时利用索引完成排序。


添加覆盖索引:我这里直接用navicat工具添加

2.png

覆盖索引:

sql只需要通过索引就可以返回查询所需要的数据,

而不必通过二级索引查到主键之后再去查询数据。


我们再用EXPLAIN跑一下:

3.png


在用上面的sql语句查询一下

> OK

> 时间: 0.011s


Extra信息已经有'Using Index',表示已经使用了覆盖索引。

经过索引优化之后,线上的查询基本不超过0.01秒。




相关文章