MySQL性能优化(一)索引缺失引起的全表扫描

俊达3年前技术文章1380


索引缺失是引起数据库性能问题的第一大原因。


一个例子

这是一个非常简单的SQL,

SELECT *
FROM template
WHERE templet_id = 2 AND status = 1


执行计划

我们来看一下这个SQL的执行计划



这是一个简单的执行计划,我们需要关注的信息主要包括:

table: 访问的表,这里是template表

type: ALL,表示全表扫描

possible_keys: 该查询可选的索引。这里没有任何索引可以使用

key: 使用的索引。这里没有使用索引

key_len: 使用到的索引长度。

rows: 预估需要访问的数据。


从这里的执行计划可以得到的信息:该查询每次执行都需要扫描3.6万行数据,没有任何索引可以使用。


优化

对于这种场景,我们可以给过滤性高的条件建立索引

alter table template
    add key idx_templateid_status(templet_id, status);


这里的关键是过滤性,如果过滤性不高,那么建了索引也不一定能提升性能。

过滤性

过滤性可以理解为使用给定where条件过滤出来的记录数占总记录数的比例,这个比例越小,则使用索引的效果越好。

可以使用如下的SQL来分析一个字段或多个字段的过滤性:

select 1 / count(distinct c) from tab;

字段的唯一值越多,则上述SQL的查询值约小,过滤性越高。


数据倾斜

在有些业务场景下,存在数据倾斜,也就是字段有的值的数据量特别大。可以通过如下SQL来判断是否存在数据分布不均匀的问题。

Select col, count(*) 
From tab
Group by col 
order by count(*)
desc limit 10


对于存在数据倾斜的场景,则索引是否有效,取决于where条件中的值的过滤性,过滤性高的就可以通过索引来提升查询效率。


组合索引

在本案例中,我们建立了一个组合索引: 

idx_templateid_status(templet_id, status)

组合索引中字段的顺序很重要,需要根据业务的查询场景来设计。关于组合索引中字段顺序的问题,我们后续再来详细分析。

相关文章

kafka单条消息过大导致线上OOM

1 线上问题kafka生产者罢工,停止生产,生产者内存急剧升高,导致程序几次重启。查看日志,发现Produce程序爆异常kafka.common.MessageSizeTooLargeExceptio...

百万并发下的nginx优化

百万并发下的nginx优化

百万并发下的nginx优化之道一、nginx地址重写1、nginx地址重写(rewrite)介绍nginx地址重写的主要功能是实现URL地址的重定向。服务器获得一个来访的URL请求,然后改写成服务器可...

Redis Sentinel与Cluster安装部署(二)

3.2cluster部署1、在对应的机器,下载、解压redis #详见sentinel部署内相关命令 2、创建对应的文件目录   mkdir -p /usr/lcoal/redis5/clust...

数据湖技术之iceberg(四)iceberg的数据类型

1  Iceberg数据类型类型描述笔记boolean布尔类型,true或者falseint32 位有符号整数可以转换成long类型long64 位有符号整数float单精度浮点型可以转换成...

Kubernetes节点与令牌管理

令牌管理查看令牌```Plain Text [root@master ~]# kubeadm token list## **删除令牌**Plain Text [root@master ~]# ku...

数据湖技术之iceberg(十一)Flink与Iceberg整合-DataStream API

数据湖技术之iceberg(十一)Flink与Iceberg整合-DataStream API

1.实时写入Iceberg表DataStream Api方式操作Iceberg方式目前仅支持Java Api。使用DataStream API 实时写入Iceberg表具体操作如下:2、编写代码使用D...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。