MySQL索引学习

来源:互联网 发布:网站源码查询 编辑:程序博客网 时间:2024/06/07 15:42

前些天面试+看书,涉及到不少MySQL索引的知识,觉得还是蛮有意思的,觉得有必要记录下来。

索引是什么

索引在MySQL中也叫作“键(key)”,是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能。索引优化对于查询性能的优化非常有效,它能够轻易将查询性能提高几个数量级。尤其是当表中的的数据量越来越大时,索引对性能的影响越重要。

什么原因会导致查询变慢

这里参考一篇博客:影响数据库访问速度的九大因素

索引的工作方式

在MySQL中,存储引擎首先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。这个跟咱们平时看书是一个道理,先查找目录(索引),找到想看的内容后再根据指引的页码找到内容。

索引类型

索引有很多种类型,可以为不同的场景提供更好的性能,并没有统一的索引标准,不同存储引擎的索引工作方式也不一样,当然也不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。在MySQL中,索引是在存储引擎层而不是服务器层实现的。

B-Tree(从技术上来说是B+Tree树)



这种索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。根节点中的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。

可以使用B-Tree索引的查询类型

适用于全键值、键值范围或者键前缀查找,其中键前缀查找只适用于根据最左前缀的查找。

哈希索引

对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hashCode),哈希码是一个较小的值,并且不同键值的行计算出来哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。在MySQL中,只有memory引擎显式支持哈希索引,并且是唯一支持非唯一哈希索引的引擎,这在数据库里面是比较特殊。

空间数据索引(R_Tree)

mISAM表支持空间索引,可以用做地理数据存储。和T-Tree不同,这类索引无需前缀查询。空间索引会从所有维度来查询数据,可以有效地使用任意维度来组合查询。MySQL的GIS相关函数如MBRCONTAINS()等来维护此类数据。但是由于MySQL并不能很好的支持GIS,所以这个特性很少有人用。

全文索引

这是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。全文索引和其他几类索引的匹配方式不同,并不是简单的where条件匹配,而是有许多需要注意的细节,比如停用词、词干、复数、布尔搜索等等。

其他索引类别

很多第三方的存储引擎使用不同类型的数据结构来存储索引。比如聚簇索引、覆盖索引等在此不赘述。