当前位置: 首页 > 科技观察

关于MySQL的索引专题——认识索引

时间:2023-03-20 17:26:20 科技观察

关于这个专题因为之前学习MySQL索引的惨痛经历,所以想写MySQL的索引专题。当你在网上搜索关于MySQL索引的文章时,大多都是零散的。没有系统的知识点列表。文章会解释你应该怎么做,但很少涉及为什么你应该做以及你不能做什么。很难对MySQL有一个系统的了解。学习如果不系统化,在实际项目中很难灵活运用。为此,我打算写一个关于MySQL索引的系列专题。也算是自己学习的一个总结吧。如果能同时帮到你就太好了。言归正传,我们先来了解一下什么是索引,以及索引的类型。了解索引了解什么是索引非常重要。一个很恰当的比喻就是书的目录页和书的正文内容之间的关系。为方便对书中内容的查找,对内容进行了索引,形成目录。所以,首先你要明白,索引也是一个文件,它占用的是物理空间。例如对于MyISAM存储引擎:.frm后缀的文件存储的是表结构。带有.myd后缀的文件存储表数据。.myi后缀的文件存放索引文件。如下图所示:对于InnoDB存储引擎:.frm后缀的文件存储表结构。.ibd后缀的文件存放的是索引文件和数据(需要开启innodb_file_per_table参数),如下图所示:因此,当你索引一个表时,索引文件的大??小也会发生变化。当你的数据表中的数据增加或删除时,索引文件也会发生变化,但MySQL会自动维护索引,这个过程不需要你的干预,这就是为什么不合适的索引会影响MySQL性能的原因。总结:1、索引就是将数据表中的数据按照特定的数据结构放在索引文件中,以便快速查找;2、索引存在于磁盘上,会占用物理空间。索引类型上面说过,索引文件是按照不同的数据结构来存储的,不同的数据结构也会产生不同的索引类型。常见的索引类型有:B-Tree索引哈希索引空间数据索引(R-Tree)全文索引下面我一一介绍:1.B-Tree索引B-Tree索引是最常用的索引。如果没有指定具体类型,它可能是B-Tree索引。其实很多搜索引擎使用的最重要的是它的变体B+Tree,它是B-Tree的一种优化。如果需要深入了解,可以参考数据结构方面的书籍,这里不再赘述。以下统称为B-Tree索引。大多数存储引擎,如MyISAM和InnoDB,都支持这种索引,所以它是使用最广泛、最常用的索引方式,但是不同的存储引擎在实现上会略有不同,比如MyISAM将索引使用前缀压缩进行压缩,而InnoDB则没有。下图展示了B-Tree索引是如何存储被索引的数据的:说明:左图是一个三列的数据表,右图是数据是如何被索引的。可以看出,B-Tree是按顺序存储索引列的,每个叶子节点都指向被索引的数据,这也是B-Tree索引支持范围搜索数据的原因。2、与B-Tree索引相比,哈希索引的实现比较简单。它是基于哈希表实现的。对于需要索引的列,存储引擎会计算出一个一一对应的哈希码,然后将哈希码作为键存入哈希表中,值为该行数据的指针。下图是一个简单的原理展示:说明:左边紫色的图代表一个两列的数据表。中间的意思是对fname列进行hash索引,计算hash值。右边的绿色图表示生成的哈希值存储在哈希表中。当我们执行如下查询时:select*fromtestTablewherefname="mary";MySQL会先计算查询条件mary的哈希值,然后去哈希表中查找哈希值。如果找到,就会根据对应的指针找到需要查找的数据行。哈希表的优点和局限性:优点:只需要比较哈希值,所以速度很快,性能优势明显;局限性:不支持任何范围查询,比如whereprice>150,因为是基于hash计算,支持等值比较。哈希表是乱序存储的,所以索引数据不能用于排序。MyISAM、InnoDB等主流存储引擎不支持该类型。哈希索引仅受Memory和NDB引擎支持。因此,哈希索引虽然速度快,但其实用处非常有限,只适用于一些特殊的场合。3、空间数据索引(R-Tree)空间索引可以用于地理数据的存储,需要GIS相关功能的支持。由于MySQL对GIS的支持并不完善,这种索引方式在MySQL中很少使用。4、全文索引全文索引主要用于海量数据的搜索,如淘宝或京东的商品搜索。您不能使用like进行模糊匹配。MySQL从5.6开始支持InnoDB引擎的全文索引,功能没有专业的搜索引擎比如Sphinx或者Solr丰富。如果你的需求比较简单,可以试试MySQL的全文索引。否则,建议使用专业的搜索引擎。总结:1.B-Tree索引是使用最广泛的,也是主流引擎支持的索引。2、哈希索引性能高,适用于特殊场合。3.R-Tree不常用。4、全文索引适用于海量数据的关键词模糊搜索。索引和存储引擎的关系上面提到了索引有不同的类型,存储引擎的类型也不同,那么索引和存储引擎是什么关系呢?首先你要知道,在MySQL中,索引是在存储引擎中的,并不是所有的存储引擎都支持所有的索引类型,比如hash索引,MyISAM和InnoDB是不支持的;同样,即使对于同一种类型的索引,不同的存储引擎也可能有不同的实现方式。例如,MyISAM和InnoDB对B-Tree索引的实现方式不同。总结:1、不同的存储引擎可能支持不同的索引类型;2.不同的存储引擎对于相同的索引类型可能有不同的实现。B-Tree索引与唯一索引、主键索引、公共索引的关系。起初,B-Tree索引与唯一索引、主键索引、公共索引的关系很模糊,在网上也没有找到相关资料。我以为他们的关系是并列的,其实不是。B-Tree只是底层算法实现。唯一索引、主键索引、普通索引都是基于B-Tree索引算法,但又各有特点。从下图也可以看出这种关系:关于唯一索引、主键索引和普通索引的区别,增加如下内容:主键索引:数据列不允许重复,不允许重复为空。一张表只能有一个主键。唯一索引:数据列不允许重复,允许NULL值,一张表允许多个列建立唯一索引。普通索引:基本索引类型,无唯一性限制,允许NULL值。总结:本文从这里开始,主要目的是对MySQL索引有一个概念上的了解,以及了解索引的类型,索引和存储引擎的关系,这个话题会持续更新,继续了解MySQL索引知识逐步展开,有兴趣的可以关注本专栏,顺便动动手指关注一下(^_^),希望本文对您有所帮助。