索引基础

1.前言

索引( Index)是帮助 MYSQL高效获取数据的数据结构。它对于高性能非常关健,但是人们通常会忘记或误解它,因此建立索引( dexing)是现实中性能问题的首要原因。

素引( MYSQL中也叫“键(Key)")在数据越大的时候越重要。规模小、负载轻的数据库即使没有索引,也能有好的性能,但是当数据增加的时候,性能就会很快下降。理解索引如何工作的最简单的方式就是把索引看成本书。为了找到书中一个特定的话题,你须要査看目录,它会告诉你页码。

MYSQL按类似的方式使用索引。它会搜索索引的数据结构来找到值。当发现匹配的时候,它就会包含这个匹配的行假如运行下列查询:

mysql> SELECT first_name FROM actor WHERE actor id =5;

索引位于actor id列,因此 MYSQL会使用索引找到 actor_id为5的行。换句话说,它在索引中按值进行查找并且返回任何包含该值的行

索引包含了来自于表中某一列或多个列的值。如果索引了多列数据,那么列的顺序非常重要,因为 MYSQL只能高效地搜索索引的最左前缀( Leftmost Prefix)。如你所见,创建一个双列索引和两个单列索引是不一样的。

2.索引类型

B-Tree索引

当人们谈及索引而没有说明其类型的时候,多半是指B-Tee索引,它通常使用B-Tree数据结构来保存数据(往6)。大部分MySQL的存储引擎都支持这种索引。Archive引擎是个例外:它直到MySQL5.1才支持索引,而且只支持索引单个AUTO_ INCRMENT 列。

使用"B-Tree" 来称呼这种索引的原因是MySQL在CREATE TABLB和其他命令中使用了它。然而,存储引擎可能会在内部使用不同的存储结构。例如,NDB Cluster 存储引擎尽管把索引标记为BTREE, 但是内部使用的是T-Tree数据结构。

存储引擎使用了不同的方式把索引保存到磁盘上,它们会影响性能。例如,MyISAM使用前缀压缩(Prefix Compression)以减小索引,而InnoDB不会压缩索引,因为它不能把压缩索引用于某些优化。同样,MyISAM索引按照行存储的物理位置引用被索引的行,但是InnoDB按照主键值弓用行。这些不同有各自的优点和缺点。

B-Tree通常意味着数据存储是有序的,并且每个叶子页(Leaf Page)到根的距离是一一样的。图3-1显示了B-Tree索引的抽象表示,它大致显示了InnoDB的索引工作过程(InnoDB 使用了B+Tree结构)。MyISAM使用了不同的结构,但是原则是类似的。

B-Tree索引加速了数据访问,因为存储引擎不会扫描整个表得到需要的数据。相反,它从根节点开始(图中没有显示)。根节点保存了指向子节点的指针,并且存储引擎会根据指针寻找数据。它通过查找节点页中的值找到正确的指针,节点页包含子节点中值的上界和下界。最后,存储引擎可能无法找到需要的数据,也可能成功地找到包含数据的叶子页面(Leaf Page)。

匹配全名

全键值匹配指和索引中的所有列匹配。

匹配最左前缀

B-Tree索引可以帮你找到姓为Allen的所有人。这仅仅适用了索引中的第1列。

匹配列前缀

可以匹配某列的值的开头部分。这种索引能帮你找到所有姓氏以J开头的人。这只会使用索引的第I列。匹配范围值

这种索引能帮你找到姓大于Allen 并且小于Barrymore的人。这也只会使用索引第一列。精确匹配一部分并且匹配某个范围中的另一部分

这种索引能帮你找到姓为Allen并且名字以字母K (Kim、 Karl 等)开头的人。它精确匹配了last_name列并且对first. name列进行了范围查询。

只访问索引的查询

B-Tree索引通常能支持只访问索引的查询,它不会访问数据行。第120页“ 覆盖索引”讨论了这种优化。由于树的节点是排好序的,它们可以用于查找(查找值)和ORDER BY查询(以排序的方式查找值)。通常来说,如果B-Tree能以某种特殊的方式找到某行,那么它也能以同样的方式对行进行排序。因此,上面讨论的所有查找方式也可以同等地应用于ORDER BY。

哈希索引

哈希索引(HashIndex)建立在哈希表的基础上,它只对使用了索引中的每一列的精确査找有用(注8)。对于每一行,存储引擎计算出了被素引列的哈希码(HashCode),它是一个较小的值,并且有可能和其他行的哈希码不同。它把哈希码保存在索引中,并且保存了一个指向哈希表中毎一行的指针。

在MYSQL中,只有Memory存储引擎支持显式的哈希索引,尽管Memory表也有B-Tree索引,但它是Memory表的默认索引类型。Memory引擎支持不唯一的哈希索引,它在数据库系统中并不常见。如果多个值有相同的哈希码,索引就会把行指针以链表(Linked List)的方式保存在哈希表的同一条记录中。

除此之外还有空间索引和全文索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值