【高性能MySQL】第五章创建高性能的索引

索引是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。
索引对于良好的性能非常关键,尤其当数据量越来越大时,索引对性能的影响愈发重要。
索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。

5.1 索引的基础

MySQL中先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。
假设有如下的SQL

select first_name from actor where actor_id = 5;

如果在actor_id列上建有索引,则MySQL将通过该索引先找到actor_id为5的行。然后返回所有包含该值的数据行。

索引可以包含一个或多个列的值,如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最高前缀列。

5.1.1 索引的类型

索引有很多种类型,可以为不同的场景提供更好的性能。MySQL中索引时在存储引擎层实现的。
先来看看MySQL支持的索引类型,以及它们的优点和缺点。

B-Tree索引

当人们谈论索引的时候,多半说的是B-Tree索引。它使用B-Tree数据结构来存储数据。大部分MySQL引擎都支持这种索引。

实际上很多存储引擎使用的是B+Tree。即每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。

B-Tree通常意味着所有的值都是按顺序存储的。并且每一个叶子页到根的距离相同。下图展示了InnoDB的索引。
在这里插入图片描述
B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎通过这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点。
叶子节点比较特殊,其指针指向被索引的数据。
B-Tree对索引列是按顺序组织存储的,所以很适合查找范围数据。

可以使用B-Tree索引的查询类型:

  • 全值匹配 (和索引中的所有列进行匹配)
  • 匹配最左前缀 (只使用索引的第一列)
  • 匹配列前缀 (只匹配某一列的开头部分)
  • 匹配范围值 (姓名在范围内的人)
  • 精确匹配某一列并范围匹配另外一列
  • 只访问索引的查询

因为索引树的节点是有序的,除了按值查找外,索引还可以用于查询中的ORDER BY操作。

B-Tree索引的限制:

  • 如果不是按照索引的最左列开始查找,则无法使用索引
  • 不能跳过索引中的列

哈希索引

哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。
对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
在MySQL中,只有Memory存储引擎显式支持哈希索引。

假设有下面的数据结构。
在这里插入图片描述
哈希索引的数据结构如下:
在这里插入图片描述
先计算‘Peter’的哈希值,并利用该值寻找对应的记录指针。
因为索引自身只需存储对应的哈希值,所以索引的结构十分紧凑。这也使哈希索引查找速度快。
限制如下:

  • 不是按照索引值顺序存储的,无法用于排序
  • 不支持部分列匹配查找
  • 只支持等值比较查询
  • 哈希冲突很多的话,索引维护的代价比较大

5.2 索引的优点

索引可以让服务器快速地定位到表的指定位置,但这不是索引的唯一作用。
最常见的B-Tree索引,按照顺序存储数据,所以MySQL可以用来做ORDER BY和GROUP BY操作。

总结索引的优点如下:

  • 索引大大减少了服务器需要扫描的数据量
  • 索引可以帮助服务器避免排序和临时表
  • 索引可以将随机I/O变为顺序I/O

但是索引并不一定是最好的工具。只有当索引帮助存储引擎快速查找的好处超过其额外工作时,才是有效的

  • 对于非常小的表,大部分情况下简单的全盘扫描更有效
  • 中到大型的表,索引非常有效
  • 特大型表,使用和建立索引的代价非常大。这时候可以使用分区等技术
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值