php网站后台怎么登陆,wordpress主题收费,网站关键词放哪,wwe中文官网站文章目录 InnoDB索引与MyISAM索引实现的区别是什么#xff1f;一个表中如果没有创建索引#xff0c;那么还会创建B树吗#xff1f;B树索引实现原理#xff08;数据结构#xff09; InnoDB索引与MyISAM索引实现的区别是什么#xff1f;
MyISAM的索引方式都是非聚簇的一个表中如果没有创建索引那么还会创建B树吗B树索引实现原理数据结构 InnoDB索引与MyISAM索引实现的区别是什么
MyISAM的索引方式都是非聚簇的与InnoDB包含1个聚簇索引是不同的。 在InnoDB存储引擎中我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录而在MyISAM中却需要进行一次回表操作意味着MyISAM中建立的索引相当于全部都是二级索引 。 InnoDB的数据文件本身就是索引文件而MyISAM索引文件和数据文件是分离的 索引文件仅保存数据记录的地址。 MyISAM的表在磁盘上存储在以下文件中 *.sdi描述表结构、*.MYD数据*.MYI索引InnoDB的表在磁盘上存储在以下文件中 .ibd表结构、索引和数据都存在一起 InnoDB的非聚簇索引data域存储相应记录主键的值 而MyISAM索引记录的是地址 。换句话说InnoDB的所有非聚簇索引都引用主键作为data域。 MyISAM的回表操作是十分快速的因为是拿着地址偏移量直接到文件中取数据的反观InnoDB是通过获取主键之后再去聚簇索引里找记录虽然说也不慢但还是比不上直接用地址去访问。 InnoDB要求表必须有主键 MyISAM可以没有 。如果没有显式指定则MySQL系统会自动选择一个可以非空且唯一标识数据记录的列作为主键。如果不存在这种列则MySQL自动为InnoDB表生成一个隐含字段作为主键这个字段长度为6个字节类型为长整型。
一个表中如果没有创建索引那么还会创建B树吗
会 如果有主键会创建聚簇索引 如果没有主键会生成rowid作为隐式主键
B树索引实现原理数据结构
假设有一个表index_demo表中有2个INT类型的列1个CHAR(1)类型的列c1列为主键
CREATE TABLE index_demo(c1 INT,c2 INT,c3 CHAR(1),PRIMARY KEY(c1)) ;index_demo表的简化的行格式示意图如下 我们只在示意图里展示记录的这几个部分
record_type表示记录的类型 0是普通记录、 2是最小记录、 3 是最大记录、1是B树非叶子节点记录。next_record表示下一条记录的相对位置我们用箭头来表明下一条记录。各个列的值这里只记录在 index_demo 表中的三个列分别是 c1 、 c2 和 c3 。其他信息除了上述3种信息以外的所有信息包括其他隐藏列的值以及记录的额外信息。
将其他信息项暂时去掉并把它竖起来的效果就是这样 把一些记录放到页里的示意图就是这里一页就是一个磁盘块代表一次IO name age sex
MySQL InnoDB的默认的页大小是16KB因此数据存储在磁盘中可能会占用多个数据页。如果各个页中的记录没有规律我们就不得不依次遍历所有的数据页。如果我们想快速的定位到需要查找的记录在哪些数据页中我们可以这样做
下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值给所有的页建立目录项 以页28为例它对应目录项2 这个目录项中包含着该页的页号28以及该页中用户记录的最小主键值 5。我们只需要把几个目录项在物理存储器上连续存储比如数组就可以实现根据主键值快速查找某条记录的功能了。比如查找主键值为 20 的记录具体查找过程分两步
先从目录项中根据二分法快速确定出主键值为20的记录在目录项3中因为 12 ≤ 20 209 对应页9。再到页9中根据二分法快速定位到主键值为 20 的用户记录。
至此针对数据页做的简易目录就搞定了。这个目录有一个别名称为索引 。