再见MYSQL - 05 - 高性能索引

索引在mysql中叫** “key” **

索引是对查询性能优化最有效的手段。

但是又常常被忽略

本章假设使用的是机械硬盘驱动器,对固态硬盘,索引的原则 依然成立,只是糟糕的索引影响没有对机械硬盘那么大

5.1 索引基础

联合索引 和 单列索引是完全不同的! 不管是创建 还是 查询

5.1.1 索引的类型

B-Tree 索引

所有的值都是按顺序存储的,且每个叶子页到根的距离相同。
因为B-TREE是按顺序存储,所以很适合查找范围数据。如按字母顺序查找 A ~ C 开头的值 。

在这里插入图片描述

联合索引

CREATE TABLE People(
	...
	key(last_name, first_name,dob)
);

在这里插入图片描述
可以看到, 先看 last_name 排序, 再看 first_name排,再再看生日排

使用的情况主要分下面几种:

在这里插入图片描述
除了按值查询,索引还可以用于 ORDER BY 操作

下面是一些 B-TREE 的索引的限制 :

要从最左列开始查, 不能不查第一个索引列,直接查第二个索引列,这时索引失效
在这里插入图片描述
不能跳过索引中的列,再到下一个列
在这里插入图片描述

到某个列的范围查询,则再往后面的索引就用不了了

到此可以策 索引的顺序是多么的重要!
在生产中可能需要内容相同, 但顺序不同的索引来满足不同类型的查询的需求

哈希索引

老版本只有Memory 引擎显式支持哈希索引,也是Memory引擎表的默认索引类型。
Memory 支持不唯一哈希索引。

哈希索引查询 分两步

  1. 获取hash值 ,取到对应的数据
  2. 再判断判断对应的值(非hash code)是不是要找的值

因为索引本身只存hash值, 所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。

但哈希索引也有他的限制:

无法用于排序

不支持部分索引

不支持大于小于 , 只支持 等于 不等于

当出现 哈希 冲突时(不同的索引列有相同的哈希值)要遍历链表中所有的行指针

哈希冲突很多的话,一些索引维护操作的代价也会很高

所以 hash索引只适用于某些特定的场合,但一旦适合, 性能 的提升就非常显著。

InnoDB 有一种自适应索引

人为的实际 hash 索引 :

人为加一列,来存hash值 , 然后设为索引 ,这时虽然是B-TREE, 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值