当前位置: 首页 > 后端技术 > Java

5分钟快速了解MySQL的各种索引

时间:2023-04-01 14:33:12 Java

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