mysql索引

了解索引之前,首先想一下,为什么有索引?索引作用不是为了查询数据,而是为了快速的查询数据。那么索引是怎么实现快速的查询呢?这就必须要了解一些数据结构的问题。
索引从概念上讲类似字典
索引的数据结构:哈希表、有序数组、搜索树
hash表=数组+链表 通过hash函数计算得出数组中的位置,如果hash出的值冲突,则在数组位置加挂链表
二叉树:索引不止存在内存中,还要写入磁盘中。数据库在设计之初就将每个节点存储在一个的数据页中。因此当数据两超过百万时,2的10次方1024,2的20次方100多万。一次查询的数据可能存储在第20个数据页中。此处可以参考:MySQL索引背后的数据结构及算法原理
因此为了减少数据查询的io次数,需要二叉树分出更多的枝杈以降低树的高度。这里就不得不了解B树与B+树的一些基本概念。B树与B+树
mysql的底层数据结构是在存储引擎中实现的,本文以Inodb为例分析索引的原理和索引优化。
这里假设我已经明白B+树的原理,那么索引如何优化呢?我们最开始想要的是提升查询的效率。B+树因为减少磁盘IO和避免多次递归,而提升了查询效率。
既然通过数据结构已经提升了数据查询的效率了,那索引在其中有什么作用?
回顾数据结构我发现,数据结构解决的是单个数据的快速查询。但我们查询数据是查的一堆数据。好的,现在答案就清晰了,索引就是数据结构里的那个数据。
那么现在我们分析怎么才能让索引更好的服务数据结构,索引的设计与数据结构越匹配,查询越高效。
首先说明一下索引的分类,在INoDB中索引按在数据结构中作用分为主键索引也称聚簇索引(主键索引的叶子节点连接的行数据)和其他索引(叶子节点连接的是主键值)。
首先索引值如果可以排序那是最好不过了,这也是官方建议表使用自增主键的原因。
索引设置的标准:
索引覆盖:可以防止回表
最左匹配:可以防止索引过多
索引失效场景:索引字段上使用函数
索引按照使用不同的可分为:联合索引,唯一索引,普通索引。
唯一索引与普通索引的区别?
结论:

  1. 在使用中,唯一索引不能有重复。主键索引可以重复。
  2. 查询效率,唯一索引与普通索引差别较小。
  3. 更新效率,普通索引避唯一索引效率要高。
    分析:数据的查询过程:①如果内存中存在,直接从内存中获取。②如果内存中没有,先从磁盘中读取到内存。
    数据更新过程:这里涉及到唯一索引和普通索引更新的不同。唯一索引需要保障数据的唯一性,因此在插入数据前需要读取数据。如果是普通索引,可以直接在change buffer中记录更新。这里唯一索引因为要进行读磁盘的io,所以效率降低。但如果恰好磁盘中有该数据的数据页,则仅仅多一次判断。
    ①如果内存中存在数据页,直接更新。
    ②如果内存中没有该数据的数据页,普通索引直接在change buffer中更新;唯一索引需要先将数据从磁盘中读取到内存中,再更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_41492331

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值