索引在目录的前面还是后面 索引与目录有什么区别( 二 )



索引在目录的前面还是后面 索引与目录有什么区别

文章插图

在 MySQL 中 , MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构 , 但是 , 两者的实现方式不太一样 。 (下面的内容整理自《Java 工程师修炼之道》)
MyISAM 引擎中 , B+Tree 叶节点的 data 域存放的是数据记录的地址 。 在索引检索的时候 , 首先按照 B+Tree 搜索算法搜索索引 , 如果指定的 Key 存在 , 则取出其 data 域的值 , 然后以 data 域的值为地址读取相应的数据记录 。 这被称为“非聚簇索引” 。
InnoDB 引擎中 , 其数据文件本身就是索引文件 。 相比 MyISAM , 索引文件和数据文件是分离的 , 其表数据文件本身就是按 B+Tree 组织的一个索引结构 , 树的叶节点 data 域保存了完整的数据记录 。 这个索引的 key 是数据表的主键 , 因此 InnoDB 表数据文件本身就是主索引 。 这被称为“聚簇索引(或聚集索引)” , 而其余的索引都作为辅助索引 , 辅助索引的 data 域存储相应记录主键的值而不是地址 , 这也是和 MyISAM 不同的地方 。 在根据主索引搜索时 , 直接找到 key 所在的节点即可取出数据;在根据辅助索引查找时 , 则需要先取出主键的值 , 在走一遍主索引 。 因此 , 在设计表的时候 , 不建议使用过长的字段作为主键 , 也不建议使用非单调的字段作为主键 , 这样会造成主索引频繁分裂 。
索引类型
主键索引(Primary Key)
数据表的主键列使用的就是主键索引 。
一张数据表有只能有一个主键 , 并且主键不能为 null , 不能重复 。
在 MySQL 的 InnoDB 的表中 , 当没有显示的指定表的主键时 , InnoDB 会自动先检查表中是否有唯一索引的字段 , 如果有 , 则选择该字段为默认的主键 , 否则 InnoDB 将会自动创建一个 6Byte 的自增主键 。
二级索引(辅助索引)
二级索引又称为辅助索引 , 是因为二级索引的叶子节点存储的数据是主键 。 也就是说 , 通过二级索引 , 可以定位主键的位置 。
唯一索引 , 普通索引 , 前缀索引等索引属于二级索引 。
PS:不懂的同学可以暂存疑 , 慢慢往下看 , 后面会有答案的 , 也可以自行搜索 。
1.唯一索引(Unique Key) :唯一索引也是一种约束 。 唯一索引的属性列不能出现重复的数据 , 但是允许数据为 NULL , 一张表允许创建多个唯一索引 。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性 , 而不是为了查询效率 。 2.普通索引(Index) :普通索引的唯一作用就是为了快速查询数据 , 一张表允许创建多个普通索引 , 并允许数据重复和 NULL 。 3.前缀索引(Prefix) :前缀索引只适用于字符串类型的数据 。 前缀索引是对文本的前几个字符创建索引 , 相比普通索引建立的数据更小 , 因为只取前几个字符 。 4.全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息 , 是目前搜索引擎数据库使用的一种技术 。 Mysql5.6 之前只有 MYISAM 引擎支持全文索引 , 5.6 之后 InnoDB 也支持了全文索引 。
二级索引:
索引在目录的前面还是后面 索引与目录有什么区别

文章插图

聚集索引与非聚集索引
聚集索引
聚集索引即索引结构和数据一起存放的索引 。 主键索引属于聚集索引 。
在 Mysql 中 , InnoDB 引擎的表的 .ibd文件就包含了该表的索引和数据 , 对于 InnoDB 引擎表来说 , 该表的索引(B+树)的每个非叶子节点存储索引 , 叶子节点存储索引和索引对应的数据 。
聚集索引的优点
聚集索引的查询速度非常的快 , 因为整个 B+树本身就是一颗多叉平衡树 , 叶子节点也都是有序的 , 定位到索引的节点 , 就相当于定位到了数据 。

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。