博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyISAM InnoDB索引实现
阅读量:3923 次
发布时间:2019-05-23

本文共 1371 字,大约阅读时间需要 4 分钟。

MyISAM索引实现

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。如图:

在这里插入图片描述
这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:
在这里插入图片描述
同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

InnoDB索引实现

在innodb引擎中行级锁分为以下三种锁

1.Record Lock

单个行记录上的锁

2.Gap Lock

间隙锁,锁定一个范围,不包括记录本身

3.Next-Key Lock

锁定一个范围和记录本身

虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

在这里插入图片描述
上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:

在这里插入图片描述
这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

总结

在数据库开发中,了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助。例如,知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好做法,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

转载地址:http://mwugn.baihongyu.com/

你可能感兴趣的文章
poj 3342 Party at Hali-Bula(树形DP+判断方式是不是唯一)
查看>>
Problem 2129 子序列个数 (动态规划题目,注意模余的问题)
查看>>
fzu Problem 2138 久违的月赛之一
查看>>
poj 1947 Rebuilding Roads(树形DP)
查看>>
ural 1056 Computer Net(树形DP)需要用到两遍dfs
查看>>
poj 1848 Tree(树形DP,太难了,三种状态,四种状态转换)
查看>>
zoj 3626 Treasure Hunt I(树形DP+分组背包)
查看>>
hdu 1011 Starship Troopers(树形DP+背包问题)
查看>>
poj 3107 Godfather(树形DP,点的个数较多, 删点使得剩余部分结点最多的最小值)
查看>>
poj 2378 Tree Cutting(树形DP,删点使得独立的部分结点数不超过n/2)
查看>>
poj 1655 Balancing Act(树形DP,删点)
查看>>
hdu 4276 The Ghost Blows Light(树形DP+最短路+分组背包)好题。。。
查看>>
zoj 3537 Cake(区间DP+最优三角形剖分)待续
查看>>
poj 2955 Brackets(区间DP,经典问题)求有规律的括号的最大长度
查看>>
hdu 1754 I Hate It(线段树,单点替换,求区间最值)
查看>>
poj 2828 Buy Tickets(线段树中单点更新较难的题目)
查看>>
poj 1991 Turning in Homework(区间DP,大区间推出小区间的思想)好题,想法很独特
查看>>
codeforces 395 B1. iwiwi(待续)
查看>>
hdu 4283 You Are the One(区间DP)题目转换难,状态难,。。。
查看>>
poj 2299 Ultra-QuickSort(树状数组+离散化的题目)据说是简单题,不过还是觉得好难。。。
查看>>