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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 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

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
2月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
87 4
|
3月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
142 0
|
28天前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
71 6
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
2月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
2月前
|
存储 SQL 关系型数据库
MySQL 动态分区管理:自动化与优化实践
本文介绍了如何利用 MySQL 的存储过程与事件调度器实现动态分区管理,自动化应对数据增长,提升查询性能与数据管理效率,并详细解析了分区创建、冲突避免及实际应用中的关键注意事项。
117 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL覆盖索引解释
总之,覆盖索引就像是图书馆中那些使得搜索变得极为迅速和简单的工具,一旦正确使用,就会让你的数据库查询飞快而轻便。让数据检索就像是读者在图书目录中以最快速度找到所需信息一样简便。这样的效率和速度,让覆盖索引成为数据库优化师傅们手中的尚方宝剑,既能够提升性能,又能够保持系统的整洁高效。
107 9
|
3月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
645 1
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!

推荐镜像

更多