MySQL---初识索引

索引(在MySQL里也叫做“键(key)”)是储存引擎用于快速找到记录的一种数据结构。这是索引的基本功能。—《高性能MySQL》第五章

索引最根本的作用是提高查询效率,对于索引,简单的理解可以把它想成一个书的目录,当我们想查找某一个知识点的时候可以大大提高我们的查找速度。

索引常见模型

1.哈希表

哈希表是以key-value结构来存储数据,但是为了解决哈希碰撞,引入了链表解决这个问题,有点类似于Java的HashMap,因为主要是键值对的存储,所以哈希表更适用于只有等值查询的场景,比如Redis、MemCached这类的NoSQL引擎。

2.有序数组

有序数组保证了顺序,因此在等值查询和范围查询表现优秀,这里二分法扮演了主要的角色。但是我们都知道数组结构不适合进行插入或者删除操作,因此有序数组只适合静态存储引擎。

3.搜索树

使用最多的是平衡树,平衡树是二叉搜索树(每个节点的左儿子小于父节点,父节点又小于右儿子)和堆合并构成的数据结构,它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,其实也可以理解成左右比较平衡的树。

树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。因为索引不仅仅存在内存中,还要写到磁盘里。

我们以m表示树高,2的m次方与N的m次方,对于同样多的数据,N值越大将会使m值变得越小,m值越小表示我们搜索访问磁盘的次数也就越少。

InnoDB 的索引模型

InnoDB使用的是b+tree模型,所有的数据都是存在b+tree中。索引的类型分为主键索引非主键索引

主键索引的叶子节点存的是整行数据。在InnoDB里,主键索引也被称为聚簇索引(clustered index)。
非主键索引的叶子节点内容是主键的值。在InnoDB里,非主键索引也被称为二级索引(secondary index)。

基于主键索引和普通索引的查询有什么区别?

  • 对于SQL select * from student where id = 1001;会进行主键查询,只需要搜索id的b+tree就可以得到结果。
  • 对于SQL select * from student where name = "jerry";会先进行普通查询搜索name的b+tree得到id后通过id执行上面的主键查询得到结果。我们将这个过程称为回表。

可见非主键索引会多扫描一棵索引树,所以我们应该尽量使用主键查询。

索引的维护

当插入数据时索引也需要更新,如果在最后加入的话讲直接插入新纪录,但是如果是在数据中间,就需要移动数据,此时如果所插入的数据页满了就需要申请一个新的数据页,进行“页分裂”和“页合并”,这是一个消耗性能和空间利用率的过程。

使用 OR 不使用自增主键?

我们知道主键索引的叶子节点存的是整行数据,而非主键索引的叶子节点内容是主键的值,因此主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。同时自增主键的追加插入在效率也是不错的选择,所以从性能和存储空间综合考虑,对于大多数业务自增主键是更合理的选择,但是也有以下情况:

  1. 只有一个索引。
  2. 该索引必须是唯一索引。

由于没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题,此时我们可以考虑将这个索引设为主键,避免每次查询需要搜索两棵树。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值