索引在mysql之中也被称为“键(key)”是存储引擎用于快速找到记录的一种数据结构。
索引有很多类型,可以为不同的场景提供更好的性能。在mysql中,索引是在存储引擎层而不是服务器层实现的。所以不同的存储引擎的索引的工作方式是不同的,也不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层的实现也是不同的。
mysql支持的索引:
1.B-TREE索引(ARCHIVE引擎不支持)
这里引用维基百科的定义:B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree),可以拥有多于2个子节点。与自平衡二叉查找 树不同,B树为系统大块数据的读写操作做了优化。B树可以减少定位记录时所经历的中间过程,从而加快存取速度。
大多数时候人们在提到索引但如果特别指明索引的类型的时候,人们指的是B-TREE索引。
B-TREE通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离都相同
B-TREE索引能够加快访问数据的速度,是因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始搜索。
B-TREE对索引列是顺序组织存储的,所以很适合查找范围数据
2.哈希索引(hash-index只有Memory引擎支持)
哈希索引是基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code) 哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
3.空间数据索引(spatitial index R-tree MyISAM引擎和Innodb引擎支持)
和B-Tree索引不同,这类索引无须前缀查询。空间索引会从所有维度来索引数据。查询时,可以有效地使用任意维度来组合查询。必须使用MySQL的GIS相关函数如MBRCONTAINS()等来维护数据。但mysql对GIS的支持目前还不完善,不建议使用。
4.全文索引
全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。全文搜索和其他几类索引的匹配方式完全不一样。它有许多需要注意的细节:如停用词,词干,和复数,布尔搜索等。全文索引更类似于搜索引擎做的事情,而不是简单的where条件匹配。全文索引适用于MATCH AGAINST操作。