本文主要介绍了MySQL索引的各种类型,有助于你更好的理解和学习MySQL索引。感兴趣的朋友可以了解一下。
什么是索引?
索引是数据库存储引擎用来快速查找指定数据的数据结构。
可以用《新华字典》来打个比方:如果说《新华字典》中每个单词的详细解释是数据库中表格的记录,那么按部首或拼音排序的目录就是索引,可以让我们快速找到某个单词的详细解释的位置。
在MySQL中,存储引擎也使用类似的方法,先在索引中找到对应的值,然后根据匹配的索引值在对应的表中找到记录的位置。
面试中为什么问索引?
之所以在面试中经常会问到索引,是因为索引是数据库良好性能的关键,是优化查询最有效的手段。索引可以轻松地将查询性能提高几个数量级。
但是,坏的索引也会影响查询性能。当表中的数据量增加时,索引对性能的影响会更大。当数据量小、责任低时,指标差对性能的影响可能不明显,但当数据量逐渐增大时,性能会急剧下降。
索引的类型
经过前面的介绍,接下来就进入正题,了解一下MySQL支持的索引类型,以及它们的原理和用法。
不同类型的索引可以为不同的场景提供更好的性能。在MySQL中,索引是在存储引擎级别实现的,而不是在服务器级别。众所周知,MySQL支持多种类型的存储引擎。因此,索引在不同存储引擎中的实现是不一样的,也不是所有存储引擎都支持所有类型的索引。即使多个存储引擎支持同一类型的索引,其底层实现也可能不同。
B-Tree索引
大多数MySQL存储引擎都支持b树索引。当我们讨论索引的时候,如果没有具体说明类型,那么大概率就是提到了B树索引。我们使用B树这个词,因为MySQL在创建表和其他语句时使用这个关键字。
然而,在不同的存储引擎的底层可以使用不同的数据结构和算法。例如,InnoDB存储引擎使用B树结构,而NDB集群存储引擎使用T树结构。不同的存储引擎使用B树索引的方式不同,性能也可能不同。比如InnoDB索引上存储的是原始数据格式,而MyISAM存储引擎使用前缀压缩技术使索引变小。InnoDB索引的行引用数据行的主键,而MyISAM存储引擎的行存储数据行的物理位置。
B-Tree索引的原理
-B树索引可以加快数据访问速度,因为不需要全表扫描就可以快速检索到所需数据。那么B树索引是如何工作的呢?让我们通过一个简单的例子来看看InnoDB的B树索引是如何工作的:
创建表“om_address ”(
` province _ name ` varchar(255)not null注释省,
` city _ name` varchar (255) not null注释 city ,
` district _ name ` varchar(255)not null注释 area ,
` detailed _ address ` varchar(255)null默认空注释详细地址,
使用BTREE索引` INDEX _ province _ city _ district `( ` province _ name `,` city_name `,` district_name `)
)ENGINE=InnoDB
这个表有四个字段,分别代表省、市、区和详细地址,还有一个B树索引,包含省、市、区三个字段。因为索引的所有值都是按顺序存储的,即节点的左子树小于当前节点,节点的右子树大于当前节点。然后在查询数据时,从索引的根节点开始搜索,根据当前节点的索引值的比较来搜索子树,直到找到对应的索引值或者根本找不到。
B-Tree索引的用法
根据B树索引的特点,可用于全值匹配、值域匹配和最左侧前缀匹配。
全值匹配是指匹配索引中的所有字段,例如查询黑龙江哈尔滨南岗区的数据。
范围匹配是指索引中某个范围的字段的匹配,但必须满足前面字段的全匹配,例如第一个字段的省名全匹配,第二个字段的city_name的范围匹配。
最左边的前缀匹配意味着索引中某个字段的第一部分匹配,但是前面的字段必须完全匹配。例如,第一个字段省_名的名称是内蒙古,第二个字段城市_名的名称以“call”开头。
散列索引
哈希基于哈希表,用于精确匹配索引所指向的数据。存储引擎为每行数据的所有索引字段计算哈希代码。哈希码是一个比较小的值,不同数据计算出来的哈希码一般都不一样。哈希代码和指向数据行的指针存储在哈希索引中。
在MySQL中,只有内存存储引擎支持哈希索引,这也是内存存储引擎默认的索引类型。另外,在InnoDB存储引擎中也使用了哈希索引,称为自适应哈希索引。当一些索引被频繁使用时,InnoDB存储引擎会基于B树索引在内存中创建另一个哈希索引,使得B树索引具有快速哈希查找的优势。
哈希索引只需要存储对应数据的哈希值,所以索引的结构非常紧凑,占用空间小,查询速度也很快。但是哈希索引只支持全值等价查询,不能进行索引字段范围匹配和部分索引字段匹配。
空间数据索引
空间数据索引(R树)主要用于存储地理数据。它索引所有维度的数据,任何维度都可以有效地用于组合查询。目前MyISAM存储引擎支持空间数据索引,但是必须使用MySQL的GIS相关功能来维护数据。
在MySQL中,空间索引只能建立在空间数据类型上,如几何、点、线串等。
全文索引
全文索引不像前面介绍的索引那样直接比较索引中的值,而是直接比较搜索文本中的关键字。类似于搜索引擎做的事情,不是简单的where条件匹配。
在同一个字段上,可以同时创建全文索引和B树索引,不会发生冲突。全文索引适合于匹配和反匹配操作,而不是普通的where条件操作。在MySQL中,全文索引只能在CHAR、VARCHAR和TEXT类型的字段上创建。
总结
索引是数据库存储引擎用来快速查找指定数据的数据结构。它包括B树索引、哈希索引、空间数据索引和全文索引。其中B树索引是最常用的一种,InnoDB存储引擎内部使用B树结构。哈希基于哈希表,用于精确匹配索引所指向的数据。空间数据索引对所有维度的数据进行索引,任何维度都可以有效地用于组合查询。全文索引是对搜索文本中的关键字进行直接比较,类似于搜索引擎。
以上是MySQL各类索引的详细介绍。有关MySQL索引类型的更多信息,请关注我们的其他相关文章!