MySQL索引的各种类型
什么是索引?
索引是数据库存储引擎用于快速查找到指定数据的一种数据结构。
可以用新华字典做类比:如果新华字典中对每个字的详细解释是数据库中表的记录,那么按部首或拼音等排序的目录就是索引,使用它可以让我们快速查找的某一个字详细解释的位置。
在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索引是怎么工作的:
create table `om_address` ( `province_name` varchar(255) not null comment '省', `city_name` varchar(255) not null comment '市', `district_name` varchar(255) not null comment '区', `detailed_address` varchar(255) null default null comment '详细地址', index `index_province_city_district`(`province_name`, `city_name`, `district_name`) using btree ) engine = innodb;
这个表*有4个字段,分别表示省、市、区和详细地址,还有一个b-tree索引,其中包含了省、市、区三个字段。因为索引的所有值都是按照顺序存储的,即:节点的左子树比当前节点小,节点的右子树比当前节点大。那么当查询数据时,从索引的根节点开始搜索,根据比较当前节点的索引值向子树进行查找,直到找到对应的索引值,或者根本没有找到。
b-tree索引的用法
根据b-tree索引的特点,它可以用于全值匹配、值范围匹配和最左前缀匹配。
- 全值匹配是指和索引中所有的字段进行匹配,比如:查询黑龙江省哈尔滨市南岗区的数据。
- 值范围匹配是指索引中字段的某一范围进行匹配,但是必须满足前面字段的全匹配,比如:第一个字段province_name省名称的全匹配,第二个字段city_name城市名称的范围匹配。
- 最左前缀匹配是指索引中字段的某一开头部分进行匹配,但是必须满足前面字段的全匹配,比如:第一个字段province_name省名称为内蒙古,第二个字段city_name城市名称以“呼”开头。
哈希索引
哈希索引是基于哈希表实现的,用于精确匹配索引所指向的数据。存储引擎对每一行数据的所有索引字段计算出一个哈希码,哈希码是一个比较小的值,并且不同的数据计算出来的哈希码一般情况下也不一样。哈希索引中存放了这个哈希码和指向这个数据行的指针。
在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结构;哈希索引是基于哈希表实现的,用于精确匹配索引所指向的数据;空间数据索引从所有维度来索引数据,查询时可以有效的使用任意维度进行组合查询;全文索引是直接比较查找的文本中的关键词,类似于搜索引擎。
以上就是mysql索引的各种类型简介的详细内容,更多关于mysql 索引类型的资料请关注其它相关文章!
推荐阅读
-
MYSQL无法启动提示: Default storage engine (InnoDB) is not available的解决方法
-
Mysql启动中 InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes 的问题
-
MySQL InnoDB和MyISAM数据引擎的差别分析
-
MySQL服务器默认安装之后调节性能的方法
-
一些mysql启动参数的说明和优化方法
-
php后台经常提示无法连接mysql 刷新后又可以访问的解决方法
-
mysql建立自定义函数的问题
-
mysql仿oracle的decode效果查询
-
mysql筛选GROUP BY多个字段组合时的用法分享
-
mysql insert if not exists防止插入重复记录的方法