索引
存储引擎用于快速找到记录的一种数据结构。
索引类型
索引有很多种类型,如:B-tree索引、哈希索引、空间数据索引R-TREE 、全文索引、主键索引等,在Mysql
中,索引是在存储引擎层而不是服务器层实现的。所以没有统一的索引标准——不同存储引擎的索引工作方式并
不一样,也不是所有存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层实现
也可能不一样。
B-Tree索引
讨论索引的时候,如果没有特别的指明类型,那么多半说的是B-Tree索引,它使用B-Tree数据结构来存储数据。
实际很多存储引擎使用的是B+Tree,即每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点
的范围遍历。
存储引擎不同的方式使用B-Tree索引,性能也各有不同,各有优劣。如:MyISAM使用前缀压缩技术使得索引更小,
但是InnoDB则按照原数据格式进行存储。 MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键
引用被索引的行
- B-Tree索引查询类型
B-Tree适用于全键值、键值范围,或者键前缀查找。
哈希索引
Hash Index 基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算
一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,
同时在哈希表中保存指向每个数据行的指针。
InnoDB引擎有一个特殊功能叫“自适应哈希索引,当InnoDB某些索引值被使用得非常频繁时,也在内存中基于B-Tree索引之上
再创建一个哈希索引。这样就让Btree索引也具有哈希索引的一些优点。这是一个完全自动的,内部的行为,用户无法控制或者
配置,不过如果有必要完全可以关闭该功能。
- 创建自定义的Hash Index
SELECT id FROM url_tbl WHERE url="http://baidu.com"
SELECT id FROM url_tbl WHERE url_crc=CRC32("http://baidu.com")
如果采用这种方式,记住不要使用SHA1和MD5()作为哈希函数,因为这两函数计算出非常长的字符串,会浪费大量的空间,比较时
也会更慢。两函数设计目标是最大限度消除冲突,但这里并不需要这样高的要求。如果数据表非常大,CRC32会出现大量的哈希冲突,
则可以考虑自己实现一个简单的64痊哈希函数。
R-Tree
MyISAM引擎支持空间索引,可以用作地理数据存储。
全文索引
全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接索引中的值。全文搜索和其他几类索引的匹配方式完全不
一样。它有很多需要注意的,如停用词、词干、复数、布尔搜索等。
索引的优点
索引可以让服务器快速定位到表的指定位置。B-Tree索引,按照顺序存储数据,可以用于order by 和Group by 操作。因为数据是
有序的,所有B-tree也就会奖相关的列值存储在一起。优点如下:
- 索引大大减少了服务器扫描的数据量
- 索引可以帮助服务器避免排序和临时表
- 将随机IO变为顺序IO