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

俊达2年前技术文章937


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


一个例子

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

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

相关文章

数据库连接异常问题排查

数据库连接异常问题排查

问题描述客户反馈应用端连接数据库异常,报错截图如下:“已超过了锁请求超时时段”。问题排查1、测试端口联通性从应用侧服务器上分别测试数据库服务端口联通性,检测服务正常监听2、数据库服务器重启同客户沟通优...

Alluxio部署

安装前准备1.1. 添加环境变量vi /etc/profile export ALLUXIO_HOME=/opt/alluxioexport PATH=$PATH:$ALLUXIO_HOME/bin ...

MySQL 创建索引报错

创建索引报错添加索引发现报错,具体报错如下:create unique index sm_sample_clothing_skc_SkcUniqueKey_uindex on sm_sample_cl...

Greenplum数据库建立外部表加载HDFS文件实践指导

Greenplum数据库建立外部表加载HDFS文件实践指导

环境概述(1)     Greenplum数据库版本号Greenplum Database 4.3.0.0POC3 build 45206(基于PostgreS...

PG体系结构(一)

PG体系结构(一)

一、进程结构PG数据库启动时会先启动一个主进程(9.3之前称为postmaster,9.3以后称为postgres server process),然后fork出一些辅助子进程(backend、bac...

在K8S上使用Clickhouse

介绍clickhouse是一款开源的分析型数据库,性能强大。本文介绍如何在K8S环境中部署和使用clickhouse。我们使用开源的clickhouse operator: https://githu...

发表评论    

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