1. 首页
  2. IT资讯

干货!图解 MySQL 索引

“u003Cpu003E优质文章,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FReCWMdgChqGBUy” img_width=”586″ img_height=”25″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003E作者 | 狼人u003Cu002Fpu003Eu003Cpu003E链接 | cnblogsu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E.comu003Cu002Fiu003Eu002Fliqiangchnu002Fpu002F9060521.htmlu003Cu002Fpu003Eu003Cpu003E看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E索引是什么?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E索引是帮助MySQL高效获取数据的数据结构。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E索引能干什么?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E提高数据查询的效率。u003Cu002Fpu003Eu003Cpu003E索引:排好序的快速查找数据结构!索引会影响where后面的查找,和order by 后面的排序。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E一、索引的分类u003Cu002Fh1u003Eu003Cpu003E1️⃣从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。u003Cu002Fpu003Eu003Cpu003E2️⃣从应用层次来分:普通索引,唯一索引,复合索引u003Cu002Fpu003Eu003Cpu003E3️⃣根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。u003Cu002Fpu003Eu003Cpu003E1️⃣中所描述的是索引存储时保存的形式,2️⃣是索引使用过程中进行的分类,两者是不同层次上的划分。不过平时讲的索引类型一般是指在应用层次的划分。u003Cu002Fpu003Eu003Cpu003E就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E普通索引u003Cu002Fstrongu003E:即一个索引只包含单个列,一个表可以有多个单列索引u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E唯一索引u003Cu002Fstrongu003E:索引列的值必须唯一,但允许有空值u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E复合索引u003Cu002Fstrongu003E:即一个索引包含多个列u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E聚簇索引(聚集索引):u003Cu002Fstrongu003E并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E非聚簇索引:u003Cu002Fstrongu003E不是聚簇索引,就是非聚簇索引(认真脸)。u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E二、索引的底层实现u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Emysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cdivu003Eu003Cpu003E不谈存储引擎,只讨论实现(抽象)u003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cu002Fblockquoteu003Eu003Cpu003Eu003Cstrongu003EHash索引u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRTmUnM144nV6TW” img_width=”980″ img_height=”452″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003Eu003Cstrongu003EB-Tree索引(MySQL使用B+Tree)u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003EB-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRTmUnMFAb9uH45″ img_width=”781″ img_height=”387″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003Eu003Cstrongu003EB+Treeu003Cu002Fstrongu003E索引u003Cu002Fpu003Eu003Cpu003E是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRTmUnMR4J01luH” img_width=”814″ img_height=”399″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003E结合存储引擎来讨论(一般默认使用B+Tree)u003Cu002Fpu003Eu003Cpu003E案例:假设有一张学生表,id为主键u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FReCWMeCG9JvIR5″ img_width=”1042″ img_height=”320″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003Eu003Cstrongu003E在MyISAM引擎中的实现u003Cu002Fstrongu003E(二级索引也是这样实现的)u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FReCWMuYIKToOrz” img_width=”1080″ img_height=”423″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003Eu003Cstrongu003E在InnoDB中的实现u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRTmUnMoD4yeIiI” img_width=”1000″ img_height=”503″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FReCWMuvFddFsqb” img_width=”1080″ img_height=”413″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E三、问题u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E问:为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Ehash:虽然可以快速定位,但是没有顺序,IO复杂度高。u003Cu002Fpu003Eu003Cpu003E二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。u003Cu002Fpu003Eu003Cpu003E红黑树:树的高度随着数据量增加而增加,IO代价高。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E问:为什么官方建议使用自增长主键作为索引。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E结合B+Tree的特点,自增主键是连续的,在u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E插入u003Cu002Fiu003E过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E插入u003Cu002Fiu003E都是u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E插入u003Cu002Fiu003E到最后。总之就是减少分裂和移动的频率。u003Cu002Fpu003Eu003Cpu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E插入u003Cu002Fiu003E连续的数据:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRSbvard9XwLg5s” img_width=”486″ img_height=”159″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E插入u003Cu002Fiu003E非连续的数据u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRSbvaryDG2NTy8″ img_width=”486″ img_height=”159″ alt=”干货!图解 MySQL 索引” inline=”0″u003Eu003Cpu003E-END-u003Cu002Fpu003Eu003Cpu003E如果看到这里,说明你喜欢这篇文章,请u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E转发u003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E、点赞u003Cu002Fstrongu003Eu003Cu002Fpu003E”

原文始发于:干货!图解 MySQL 索引

主题测试文章,只做测试使用。发布者:℅傍ㄖ免沦陷dε鬼,转转请注明出处:http://www.cxybcw.com/17980.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code