首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 基础架构:一条SQL查询语句是如何执行的?
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
07 | 行锁功过:怎么减少行锁对性能的影响?
08 | 事务到底是隔离的还是不隔离的?
09 | 普通索引和唯一索引,应该怎么选择?
10 | MySQL为什么有时候会选错索引?
11 | 怎么给字符串字段加索引?
12 | 为什么我的MySQL会“抖”一下?
13 | 为什么表数据删掉一半,表文件大小不变?
14 | count(*)这么慢,我该怎么办?
15 | 答疑文章(一):日志和索引相关问题
16 | “order by”是怎么工作的?
17 | 如何正确地显示随机消息?
18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?
19 | 为什么我只查一行的语句,也执行这么慢?
20 | 幻读是什么,幻读有什么问题?
21 | 为什么我只改一行的语句,锁这么多?
22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
23 | MySQL是怎么保证数据不丢的?
24 | MySQL是怎么保证主备一致的?
25 | MySQL是怎么保证高可用的?
26 | 备库为什么会延迟好几个小时?
27 | 主库出问题了,从库怎么办?
28 | 读写分离有哪些坑?
29 | 如何判断一个数据库是不是出问题了?
30 | 答疑文章(二):用动态的观点看加锁
31 | 误删数据后除了跑路,还能怎么办?
32 | 为什么还有kill不掉的语句?
33 | 我查这么多数据,会不会把数据库内存打爆?
34 | 到底可不可以使用join?
35 | join语句怎么优化?
36 | 为什么临时表可以重名?
37 | 什么时候会使用内部临时表?
38 | 都说InnoDB好,那还要不要使用Memory引擎?
39 | 自增主键为什么不是连续的?
40 | insert语句的锁为什么这么多?
41 | 怎么最快地复制一张表?
42 | grant之后要跟着flush privileges吗?
43 | 要不要使用分区表?
44 | 答疑文章(三):说一说这些好问题
45 | 自增id用完怎么办?
当前位置:
首页>>
技术小册>>
MySQL 实战 45 讲
小册名称:MySQL 实战 45 讲
### 05 | 深入浅出索引(下) 在上一章节中,我们初步探索了MySQL索引的基本概念、类型以及它们对查询性能的影响。本章节,我们将深入“深入浅出索引”的下篇,不仅进一步剖析索引的内部机制、优化策略,还会探讨索引的高级应用及常见误区,帮助读者更全面地掌握MySQL索引的精髓。 #### 一、索引的内部机制详解 ##### 1.1 B+树索引的深入 MySQL中最常用的索引类型是B+树索引。B+树是一种多路平衡查找树,它通过维护数据的有序性,使得查询、插入、删除等操作都能保持较高的效率。在B+树中,所有的值都存储在叶子节点上,并通过链表相连,非叶子节点仅存储键值信息,用于指引搜索方向。这种设计使得B+树在范围查询时尤为高效,因为可以直接在叶子节点间遍历。 **分裂与合并**:随着数据的插入和删除,B+树会进行必要的分裂和合并操作以保持树的平衡。分裂发生在节点过满时,而合并则发生在节点过空(或删除操作后)且相邻节点有足够空间时。这些操作确保了B+树的高度始终保持在较低水平,从而保证了查询效率。 ##### 1.2 哈希索引与全文索引的补充 虽然B+树索引是MySQL中最常用的,但哈希索引和全文索引也在特定场景下发挥着重要作用。 - **哈希索引**:基于哈希表实现,适用于等值查询,查询速度极快,但无法用于范围查询和排序操作。哈希索引的维护成本也较低,因为不需要像B+树那样保持数据的物理顺序。 - **全文索引**:专为文本数据设计,用于快速查找文本中的关键词。全文索引通过分词、建立倒排索引等技术,支持复杂的查询条件,如模糊匹配、逻辑组合等。 #### 二、索引优化策略 ##### 2.1 选择合适的索引列 - **高频查询列**:优先选择查询频率高的列作为索引列。 - **过滤性强的列**:即该列上不同值的数量多,能够有效减少结果集大小。 - **避免索引冗余**:避免创建重复的索引,比如索引(A, B)和索引(A)在大多数情况下,索引(A, B)已经足够。 ##### 2.2 索引维护 - **定期分析并优化索引**:使用`ANALYZE TABLE`命令更新表的统计信息,以便优化器能做出更准确的执行计划选择。 - **删除无用索引**:定期审查数据库中的索引,删除那些不再使用或极少使用的索引,减少数据库维护成本。 ##### 2.3 索引与查询优化 - **利用索引覆盖扫描**:尽可能让查询只访问索引,而不需要回表查询数据行。 - **避免索引失效**:注意查询条件中的函数操作、类型转换、不等于(<>)操作等,这些都可能导致索引失效。 - **多表连接时的索引策略**:合理设计连接条件上的索引,可以显著提高连接查询的效率。 #### 三、索引的高级应用 ##### 3.1 复合索引 复合索引(也称为组合索引)是指基于两个或多个列创建的索引。在创建复合索引时,需要考虑列的查询顺序和过滤性。合理的复合索引可以大幅减少查询时需要扫描的数据量。 ##### 3.2 前缀索引 对于很长的字符串列,可以创建前缀索引来减少索引的存储空间和提高索引效率。但需要注意的是,前缀长度的选择需要权衡查询效率和唯一性。 ##### 3.3 索引下推 索引下推(Index Condition Pushdown, ICP)是MySQL 5.6及以上版本引入的一项优化技术。它允许存储引擎在访问索引时,就应用WHERE子句中的部分条件,从而减少需要回表查询的数据量。 #### 四、索引的误区与陷阱 ##### 4.1 索引不是万能的 虽然索引可以显著提高查询性能,但它也会带来额外的维护开销,如占用存储空间、影响插入和删除操作的性能等。因此,不能盲目地创建索引,而应根据实际业务需求和数据特点进行权衡。 ##### 4.2 过多的索引是负担 每个索引都需要占用额外的存储空间,并且在数据插入、更新和删除时都需要同步维护索引。如果索引过多,不仅会增加数据库的维护成本,还可能降低写操作的性能。 ##### 4.3 索引选择不当的问题 - **索引列选择不当**:如选择了过滤性差的列作为索引列,导致索引效果不佳。 - **索引顺序不合理**:复合索引中列的顺序不当,也会影响查询性能。 - **未考虑查询条件**:在创建索引时未充分考虑查询条件,导致索引无法被有效利用。 #### 五、总结 索引是MySQL数据库性能优化的重要手段之一。通过深入理解索引的内部机制、掌握索引的优化策略和应用技巧,并避免常见的误区和陷阱,我们可以有效地提升数据库的查询性能。然而,索引并非万能药,合理的索引设计需要基于对数据库使用情况的深入了解和分析。希望本章节的内容能够为您在MySQL索引的使用和优化上提供有益的参考和指导。
上一篇:
04 | 深入浅出索引(上)
下一篇:
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
该分类下的相关小册推荐:
MySQL从入门到精通(五)
细说MySQL(零基础到高级应用)
SQL零基础到熟练应用(增删改查)
MySQL8.0入门与实践
MySQL必会核心问题
MySQL从入门到精通(二)
MySQL从入门到精通(四)
MySQL从入门到精通(一)
MySQL从入门到精通(三)