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

俊达3年前技术文章1379


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


一个例子

这是一个非常简单的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)

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

相关文章

Hue跑shell脚本报没权限问题

Hue跑shell脚本报没权限问题

1、客户反应运行脚本如下:经过排查服务器上没有workflow用户,尝试用root、admin测试正常 2、调用脚本运行失败1、给予脚本执行权限 chmod +x data-test.sh 2、/u...

Datanode节点坏卷处理

Datanode节点坏卷处理

1、告知客户故障信息,确定是否有备用磁盘更换2、停止故障节点的所有角色服务3、卸载故障磁盘umount -vl /data64、等待硬件厂商更换好磁盘5、对新磁盘分区和格式化#1.磁盘分区 mkfs...

MinIO文件服务

MinIO文件服务

MinIO官网地址:docs.min.io/cn/一、Minio简介Minio 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大...

用了函数就无法使用索引?MySQL函数索引值得你拥有

MySQL中的索引,就像图书馆里的索引卡片,帮我们快速定位到想要的信息。但是,如果你对这些卡片动了点“手脚”,比如用个函数来“改造”一下索引字段,那么这些卡片可能就不再那么有效了,查找起来就得费劲多了...

Hbase映射为Hive外表

Hbase映射为Hive外表

Hbase对应Hive外表(背景:在做数据ETL中,可能原始数据在列式存储Hbase中,这个时候,如果我们想清洗数据,可以考虑把Hbase表映射为Hive的外表,然后使用Hive的HQL来清除处理数据...

OSS bucket权限设置

OSS bucket权限设置

问题描述调用oss的bucket资源,开始的时候可以访问,过几分钟再访问的时候,就提示拒绝访问问题原因是因为相应的bucket权限为私有,私有权限在访问文件对象时,是存在鉴权URL,存在时间有效性,所...

发表评论    

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