加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

终于有人将MySQL索引讲清楚了

发布时间:2019-07-11 07:53:30 所属栏目:编程 来源:米兜Java
导读:01媒介 看了许多关于索引的博客,讲的大同小异。可是始终没有让我大白关于索引的一些观念,如B-Tree索引,Hash索引,独一索引.... 或者有许多人和我一样,没搞清晰观念就开始研究B-Tree,B+Tree等布局,导致在口试的时辰答非所问! 索引是什么? 索引是辅佐

01媒介

看了许多关于索引的博客,讲的大同小异。可是始终没有让我大白关于索引的一些观念,如B-Tree索引,Hash索引,独一索引....

或者有许多人和我一样,没搞清晰观念就开始研究B-Tree,B+Tree等布局,导致在口试的时辰答非所问!

索引是什么?

索引是辅佐MySQL高效获取数据的数据布局。

索引醒目什么?

进步数据查询的服从。

索引:排好序的快速查找数据布局!索引会影响where后头的查找,和order by 后头的排序。

02索引的分类
  1. 从存储布局上来分别:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。
  2. 从应用条理来分:平凡索引,独一索引,复合索引
  3. 按照中数据的物理次序与键值的逻辑(索引)次序相关:聚积索引,非聚积索引。

第一点描写的是索引存储时生涯的情势,第二点是索引行使进程中举办的分类,两者是差异条理上的分别。不外平常讲的索引范例一样平常是指在应用条理的分别。

就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。

平凡索引:即一个索引只包括单个列,一个表可以有多个单列索引

独一索引:索引列的值必需独一,但应承有空值

复合索引:即一个索引包括多个列

聚簇索引(聚积索引):并不是一种单独的索引范例,而是一种数据存储方法。详细细节取决于差异的实现,InnoDB的聚簇索引着实就是在统一个布局中生涯了B-Tree索引(技能上来说是B+Tree)和数据行。

非聚簇索引:不是聚簇索引,就长短聚簇索引(当真脸)。

03索引的底层实现
mysql默认存储引擎innodb只显式支持B-Tree( 从技能上来说
是B+Tree)索引,对付频仍会见的表,innodb会透明成立自顺应hash索引,
即在B树索引基本上成立hash索引,可以明显进步查找服从,对付客户端是
透明的,不行节制的,隐式的。
不谈存储引擎,只接头实现(抽象)

Hash索引

基于哈希表实现,只有准确匹配索引全部列的查询才有用。

对付每一行数据,存储引擎城市对全部的索引列计较一个哈希码(hash code),而且Hash索引将全部的哈希码存储在索引中,同时在索引表中生涯指向每个数据行的指针。

终于有人将 MySQL 索引讲清晰了

B-Tree索引(MySQL行使B+Tree)

B-Tree能加速数据的会见速率,由于存储引擎不再必要举办全表扫描来获取数据,数据漫衍在各个节点之中。

终于有人将 MySQL 索引讲清晰了

B+Tree索引

是B-Tree的改造版本,同时也是数据库索引所回收的存储布局。

数据都在叶子节点上,而且增进了次序会见指针,每个叶子节点都指向相邻的叶子节点的地点。

对比B-Tree来说,举办范畴查找时只必要查找两个节点,举办遍历即可。而B-Tree必要获取全部节点,对比之下B+Tree服从更高。

终于有人将 MySQL 索引讲清晰了

团结存储引擎来接头(一样平常默认行使B+Tree)

案例:假设有一张门生表,id为主键

idnamebirthday1Tom1996-01-012Jann1996-01-043Ray1996-01-084Michael1996-01-105Jack1996-01-136Steven1996-01-237Lily1996-01-25

在MyISAM引擎中的实现(二级索引也是这样实现的)

终于有人将 MySQL 索引讲清晰了

在InnoDB中的实现

终于有人将 MySQL 索引讲清晰了

终于有人将 MySQL 索引讲清晰了

04题目

问:为什么索引布局默认行使B-Tree,而不是hash,二叉树,红黑树?

hash:固然可以快速定位,可是没有次序,IO伟大度高。

二叉树:树的高度不匀称,不能自均衡,查找服从跟数据有关(树的高度),而且IO价钱高。

红黑树:树的高度跟着数据量增进而增进,IO价钱高。

问:为什么官方提议行使自增添主键作为索引。

团结B+Tree的特点,自增主键是持续的,在插入进程中只管镌汰页破碎,纵然要举办页破碎,也只会破碎很少一部门。

而且能镌汰数据的移动,每次插入都是插入到最后。总之就是镌汰破碎和移动的频率。

插入持续的数据:

终于有人将 MySQL 索引讲清晰了

插入非持续的数据

终于有人将 MySQL 索引讲清晰了

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读