终于有人将MySQL索引讲清楚了
01媒介 看了许多关于索引的博客,讲的大同小异。可是始终没有让我大白关于索引的一些观念,如B-Tree索引,Hash索引,独一索引.... 或者有许多人和我一样,没搞清晰观念就开始研究B-Tree,B+Tree等布局,导致在口试的时辰答非所问! 索引是什么? 索引是辅佐MySQL高效获取数据的数据布局。 索引醒目什么? 进步数据查询的服从。 索引:排好序的快速查找数据布局!索引会影响where后头的查找,和order by 后头的排序。 02索引的分类
第一点描写的是索引存储时生涯的情势,第二点是索引行使进程中举办的分类,两者是差异条理上的分别。不外平常讲的索引范例一样平常是指在应用条理的分别。 就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。 平凡索引:即一个索引只包括单个列,一个表可以有多个单列索引 独一索引:索引列的值必需独一,但应承有空值 复合索引:即一个索引包括多个列 聚簇索引(聚积索引):并不是一种单独的索引范例,而是一种数据存储方法。详细细节取决于差异的实现,InnoDB的聚簇索引着实就是在统一个布局中生涯了B-Tree索引(技能上来说是B+Tree)和数据行。 非聚簇索引:不是聚簇索引,就长短聚簇索引(当真脸)。 03索引的底层实现mysql默认存储引擎innodb只显式支持B-Tree( 从技能上来说 不谈存储引擎,只接头实现(抽象) Hash索引 基于哈希表实现,只有准确匹配索引全部列的查询才有用。 对付每一行数据,存储引擎城市对全部的索引列计较一个哈希码(hash code),而且Hash索引将全部的哈希码存储在索引中,同时在索引表中生涯指向每个数据行的指针。 B-Tree索引(MySQL行使B+Tree) B-Tree能加速数据的会见速率,由于存储引擎不再必要举办全表扫描来获取数据,数据漫衍在各个节点之中。 B+Tree索引 是B-Tree的改造版本,同时也是数据库索引所回收的存储布局。 数据都在叶子节点上,而且增进了次序会见指针,每个叶子节点都指向相邻的叶子节点的地点。 对比B-Tree来说,举办范畴查找时只必要查找两个节点,举办遍历即可。而B-Tree必要获取全部节点,对比之下B+Tree服从更高。 团结存储引擎来接头(一样平常默认行使B+Tree) 案例:假设有一张门生表,id为主键 idnamebirthday1Tom1996-01-012Jann1996-01-043Ray1996-01-084Michael1996-01-105Jack1996-01-136Steven1996-01-237Lily1996-01-25 在MyISAM引擎中的实现(二级索引也是这样实现的) 在InnoDB中的实现 ![]() 问:为什么索引布局默认行使B-Tree,而不是hash,二叉树,红黑树? hash:固然可以快速定位,可是没有次序,IO伟大度高。 二叉树:树的高度不匀称,不能自均衡,查找服从跟数据有关(树的高度),而且IO价钱高。 红黑树:树的高度跟着数据量增进而增进,IO价钱高。 问:为什么官方提议行使自增添主键作为索引。 团结B+Tree的特点,自增主键是持续的,在插入进程中只管镌汰页破碎,纵然要举办页破碎,也只会破碎很少一部门。 而且能镌汰数据的移动,每次插入都是插入到最后。总之就是镌汰破碎和移动的频率。 插入持续的数据: 插入非持续的数据 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |