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

俊达3年前技术文章1301


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


一个例子

这是一个非常简单的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日志数据清理策略

kafka日志数据清理策略

1.关于Kafka的日志在Kafka中,日志分为两种:1、数据日志是指Kafka的topic中存储的数据,这种日志的路径是$KAFKA_HOME/config/server.properties文件中...

Impala 操作命令

Impala 操作命令

Impala的外部shell选项描述-h, --help显示帮助信息-v or --version显示版本信息-i hostname, --impalad=hostname 指定连接运行 impala...

MySQL 切换主备(三)

MySQL 切换主备(三)

三、切换主备:3.1、确认主库角色查看 vip 状态,目前在主库上面。3.2、确认备库角色此时备库read_only=1只读不写查看数据库读写状态:show global variables like...

PostgreSQL 会话管理

说明当数据库发生持续的 CPU 使用率打高时,数据库中很可能正在跑一些大查询或者较复杂的 SQL,如果不及时处理很可能会影响到业务,此时我们需要通过查询会话找到 “罪魁祸首” 并 kill 掉它,然后...

MySQL优化器特性(四)表关联之BNL(Block Nested Loop)和Hash Join

MySQL优化器特性(四)表关联之BNL(Block Nested Loop)和Hash Join

什么是BNLMySQL表关联时,如果关联条件上没有合适的索引,则join时,对于驱动表的每一条记录,都需要全表扫描被驱动表。如果驱动表有多条数据,则需要多次全表扫描被驱动表,查询性能很差。对于这种情况...

HBase使用snappy压缩

HBase使用snappy压缩

安装编译环境依赖yum install -y automake autoconf gcc-c++ cmake libedit libtool openssl-devel ncurses-devel安装...

发表评论    

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