`

【MySQL】索引结构

 
阅读更多

为数据表增加索引(Index)可以提升MySQL数据查询效率。MySQL中所有类型的数据字段都可以有索引。索引指向了数据表中的记录(行),可以快速判断某行记录是否符合 where 语句中的限定条件。

但是索引并不是越多越好:

  • 索引需要耗费存储空间
  • 索引越多,MySQL在决定采用哪个索引时也会消耗更多时间
  • 数据的 增、删、改 都会引起索引的维护操作

如果总共就一、二千条数据,或目标列的查询使用率很低,或重复索引值占比过高,就没必要创建索引。

 

MySQL中的索引结构

B+Tree

MyISAM 和 InnoDB 都使用了 B+Tree 作为索引的数据结构。

(空间索引 Spatial Index 使用了 RTree)

 

B+Tree 是一种特殊的树形数据结构。

与 B-Tree 相比,B+Tree 的内部节点没有指向data的指针,关键字存储更紧凑。所以关键字在磁盘与内存之间传输时所需读写次数更少。

 

MyISAM

MyISAM 存储引擎中,叶节点 data 域存放的是数据记录的地址。索引文件和数据文件是分开的。按索引检索时,先找到索引,获得data域中的数据记录地址,再访问相应的数据记录。

MyISAM 中的辅助索引(Secondary Index)与主索引结构相同。区别是辅助索引的key可以重复。

 

InnoDB

InnoDB 存储引擎中,数据文件本身就是索引文件,叶节点的data域保存了完整的数据记录。

=> 如果主键不是单调字段,Insert 操作可能会导致为了维护B+Tree而频繁调整数据文件。

但是,选取具有实际业务意义的字段作为主键是正确的做法。不要为了单方面的性能而选择一个毫无意义的自增主键。从业务整体考虑性能优化更有意义。

InnoDB 的Table中都有主键。如果没有显式指定主键,MySQL会为其生成一个隐含的字段作为主键。

InnoDB 中辅助索引与主索引结构相同,但其data域存的是主键。按辅助索引检索是,先找到辅助索引,获得data域中的主键,再按主索引找到数据记录。

=> 主键字段内容过长会显著增加辅助索引的存储空间消耗

 

B+Tree 与 B-Tree 示例:

(图片来自《索引基础——B-Tree、B+Tree、红黑树、B*Tree数据结构》)

 

B+Tree:


B-Tree:

 

Hash Index

Hash Index 是一种常见的索引实现方式。MySQL只将其作为辅助性的索引,因为它不能很好地满足 MySQL 的需求:

  • Hash Index 不支持通过比较操作(大于、小于)查找符合某个取值范围的数据

    Hash Index 只用于“等于(=)”操作。它很适合“key-value”形式的数据存储结构。
    如果有这方面的需求,也许Redis是一个不错的选择。

  • Hash Index 无法加速 Order By 操作

    因为不支持查询“下一条”有序的数据。

  • Hash Index 不支持针对取值范围的数据量评估。MySQL需要评估满足取值范围的数据条数,以此决定使用哪个索引。
  • Hash Index 只支持整个 key 比对。BTree Index 支持最左部分匹配:只指定索引最左侧部分列也能使用多列索引。

 

网上有很多关于MySQL索引数据结构和算法的详细介绍。那些详细深入数据结构的原理知识可以帮助我们更好地理解MySQL的行为特性,明白那些“最佳实践”背后的原因,进而减少“死记硬背”式的学习过程。其实一名合格的DBA不需要知道这些艰涩的数据结构与算法。能熟读官网上的使用手册,水平就非常不错了(能灵活运用是另一码事)。就好比修车人员不需要知道发动机的设计和制造工序。这远超上层业务应用开发人员的必要水平。当然,如果是为了应付面试,那情况又不同了。“面试造火箭,实际工作工作搬砖”的情况是普遍现象。在很大程度上,这些艰涩知识起到的主要作用是试探应聘者综合基础能力/潜力。

 

  • 大小: 35.3 KB
  • 大小: 61.4 KB
分享到:
评论

相关推荐

    由浅入深探究mysql索引结构原理、性能分析与优化

    由浅入深探究mysql索引结构原理、性能分析与优化

    MySQL Innodb 索引原理详解

    在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) 搜索二叉树是一种特殊的二叉树,每个节点至多有两个子...

    MySQL索引背后的数据结构及算法原理

    ### MySQL索引背后的数据结构及算法原理 #### 数据结构及算法基础 索引在数据库中的作用至关重要,它能够显著提高数据检索的速度。正如标题所提到的,“MySQL索引背后的数据结构及算法原理”这一主题是技术面试中...

    Mysql索引数据结构.pptx

    MySQL 索引数据结构是数据库管理系统中提升查询效率的关键技术。当我们在处理查询速度较慢的 SQL 语句时,通常会考虑引入索引来优化。索引是一种特殊的数据结构,它按照一定的排序规则存储了数据表中的部分或全部...

    MySQL 索引最佳实践

    本文将深入探讨MySQL索引的最佳实践,旨在为开发者和数据库管理员提供实用指南。 ### 理解索引的重要性 索引的存在主要是为了加速数据库中的数据访问速度。在没有索引的情况下,数据库必须遍历整个表来查找特定的...

    mysql存储与索引技术

    应根据应用需求选择合适的存储引擎,合理设计索引结构,同时关注索引带来的存储和性能影响,以实现数据库的最佳运行状态。在实践中,定期评估和调整索引策略,结合具体的业务场景进行优化,是保持数据库高效运行的...

    MySQL索引 聚集索引

    MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。

    mysql 索引与执行计划

    这种方式类似于数据库中的B+树索引结构,使得查询更加高效。 MySQL中的索引也有类似的设计,例如BTREE索引。每个节点包含了主键ID,当通过主键ID查询数据时,首先会查询索引库以快速定位到具体的数据记录。 ##### ...

    MySQL索引最佳实践

    - 定期审查和优化索引策略,根据实际查询模式调整索引结构。 通过以上内容的学习,我们可以了解到MySQL索引的重要性和不同类型的索引在实际应用中的优势与局限性。正确地理解和运用这些知识可以帮助我们更高效地...

    Mysql(索引结构/事务/锁/MVCC/BufferPool/优化)总结

    对Mysql(索引结构/事务/锁/MVCC/BufferPool/优化)总结,包括重要知识点与面试点,xmind源文件

    MySQL索引类型大汇总

    MySQL 索引类型大汇总 MySQL 索引类型是数据库性能优化的关键所在。索引可以大幅度提高查询速度,提高数据库的高效运行。在 MySQL 中,索引可以分为单列索引和组合索引两种。 1. 普通索引 普通索引是最基本的索引...

    MySQL索引的数据结构与算法.pptx

    ### MySQL索引的数据结构与算法 #### 一、MySQL存储引擎概述 MySQL提供了多种存储引擎以适应不同的应用场景。其中,最常用的包括InnoDB、MyISAM、MEMORY等。每种存储引擎都有其特点和适用场景。 - **InnoDB**:...

    mysql的索引优化

    - **索引结构**:MySQL索引通常是以B树形式存储的。B树具有良好的查询性能,即使在大型数据集中也能保持高效的查找能力。 - **索引的组成**:对于每个索引项,MySQL都会保存一个指向实际数据文件中记录位置的“指针...

    MySQL索引.pptx

    本文档主要针对对Mysql初级爱好者进行探讨学习,欢迎更多的热爱技术、喜欢技术愿意分享技术的朋友交流。

    MySQL索引背后的数据结构及算法原理-07071521.pdf

    当前大多数数据库系统及文件系统采用B-Tree或其变种B+Tree作为索引结构。B-Tree是一种多路平衡查找树,适用于读写相对平衡的场景。一个B-Tree节点由若干个key和指向子节点的指针组成,满足特定条件,例如节点中的key...

    mysql索引数据结构详解

    MySQL 索引数据结构详解 MySQL 索引是一种特殊的数据结构,它可以帮助快速定位和检索数据。索引的主要目的便是降低树的高度,从而提高查询效率。下面我们将详细介绍 MySQL 索引的数据结构和工作原理。 索引的存储 ...

Global site tag (gtag.js) - Google Analytics