浅谈MySQL原理与优化(三)—— 索引

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 索引是数据库中的一种非常重要的存储结构。优秀的索引对于数据库性能有着很大的提升。本文解析了MySQL索引的原理,并给出了一些索引的设计原则

索引是数据库中的一种非常重要的存储结构。优秀的索引对于数据库性能有着很大的提升。索引的英文是index。这个词最早的含义是书的目录。类似于下图的样子。

image.png

一本书有很多页,当我们想找一个内容的时候其实是很费时费力的,但是当我们有了索引目录以后,通过每一条索引记录中关键词和页码的对应关系,我们就可以更快的找到想要的内容。

image.png

为了加快查找速度,索引记录一定是按关键词顺序排列的,而且我们还可以建立类似下图的多级目录的结构,第一级用来索引关键词首字母,这样可以让我们快速的跳过无关的目录内容,进一步提升查找的性能。

数据库索引的作用也是类似的,本质是建立了一个数据库表中字段的值和数据存储位置的对应关系。同样,为了加速查找速度,索引记录也是按照值的顺序来排列,并且有多个层级。这个数据结构一般被实现为B+树。

image.png

最终每一条记录会指向数据的”存储位置”(这个位置是广义上的,对于不同的存储引擎,位置的实现不同)

那么我们怎么样建立数据库索引才能产生更好的性能呢。我们注意要满足以下的原则:

1. 索引要有区分度

好的索引是能够把数据均匀的分成尽可能多的子群。类似于性别这样的字段其实非常不适合做索引。因为只能把人群分成两部分,最多只能过滤一半人。考虑一下省份这个字段,如果有确定的值,可以过滤掉 95%以上的人。但是省份字段并非完美,因为每个省的人数可能不一样,有些省的人口可能人数很多,这样的的话有些情况下可能只能过滤掉90%的人,区分度有些损失。

2. 索引要有确定的值,NULL无法被索引

根据SQL标准,NULL值和其他值的比较是无法确定的。大部分情况下,NULL值无法被索引。即便SQL语句中用到了IS NULL的条件,也无法用到索引。所以如果字段中空值太多就不适合作为索引。如果一定要索引空值,可以考虑给空值一个特殊的确定值。但是仍然要考虑空值占比

3. 索引会影响更新,非越多越好

由于索引是根据数据字段的值进行排列的数据结构,数据值的修改会导致索引的更新,会有一定的性能开销,索引加的越多,性能开销越大。

4. 多个字段可以组成复合索引,但是在MySQL中要满足最左前缀匹配。

可以为多个字段建立同一个索引,索引记录中会按照这两个字段拼接起来排序。所以查询要满足最左前缀匹配,也就是说复合索引(a,b,c)可以对a=1 and b=2 and c =3和a=1 and b =2 和 a=1 这样的条件生效,但是对于 b=2 and c=3,b=2 或者c=3 这类的条件无法发挥作用。

5. 避免在字段上使用子查询

如果在字段上使用子查询的话是无法使用索引的,比如下面这一句并不能用到actor_id这个索引。
image.png

你也许会觉得Mysql会先执行in里的子查询,再使用actor_id的索引,实际上并不是这样。Mysql会对每一个actor_id执行一遍子查询,性能会比较差

如果将其改写成Join则性能会提升很多。

image.png

6. 避免在字段上使用函数

在字段上使用函数再做比较的话,是无法用到索引的,因为索引只记录了原始的值和数据位置的对应关系,并没有记录函数处理后的值。如果一定要用函数,一种处理是在数据库中直接存储函数处理以后的值,并建立索引。另一种办法是使用特殊的函数索引(需要更高的mysql版本)
image.png

希望以上的内容,对大家的日常工作能起到帮助。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2天前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
3天前
|
SQL 存储 关系型数据库
MySQL原理简介—1.SQL的执行流程
本文介绍了MySQL驱动、数据库连接池及SQL执行流程的关键组件和作用。主要内容包括:MySQL驱动用于建立Java系统与数据库的网络连接;数据库连接池提高多线程并发访问效率;MySQL中的连接池维护多个数据库连接并进行权限验证;网络连接由线程处理,监听请求并读取数据;SQL接口负责执行SQL语句;查询解析器将SQL语句解析为可执行逻辑;查询优化器选择最优查询路径;存储引擎接口负责实际的数据操作;执行器根据优化后的执行计划调用存储引擎接口完成SQL语句的执行。整个流程确保了高效、安全地处理SQL请求。
106 75
|
2天前
|
存储 SQL 缓存
MySQL原理简介—2.InnoDB架构原理和执行流程
本文介绍了MySQL中更新语句的执行流程及其背后的机制,主要包括: 1. **更新语句的执行流程**:从SQL解析到执行器调用InnoDB存储引擎接口。 2. **Buffer Pool缓冲池**:缓存磁盘数据,减少磁盘I/O。 3. **Undo日志**:记录更新前的数据,支持事务回滚。 4. **Redo日志**:确保事务持久性,防止宕机导致的数据丢失。 5. **Binlog日志**:记录逻辑操作,用于数据恢复和主从复制。 6. **事务提交机制**:包括redo日志和binlog日志的刷盘策略,确保数据一致性。 7. **后台IO线程**:将内存中的脏数据异步刷入磁盘。
|
1天前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
|
15天前
|
监控 关系型数据库 MySQL
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
45 22
|
15天前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
|
18天前
|
存储 关系型数据库 MySQL
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
69 16
|
30天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。
|
19天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
153 0