mysql b-tree索引
来源:互联网 发布:php怎么搭建sup 编辑:程序博客网 时间:2024/04/30 12:53
索引优化,可以说是数据库相关优化,尤其是Query 优化中最常用的优化手段之一。很多人大部分时候都只是大概了解索引的用途,知道索引能够让 Query 执行得更快,但并不知道为什么会更快。尤其是索引的实现原理、存储方式,以及不同索引之间的区别等就更不清楚了。正因为索引对Query的性能影响很大,所以我们更应该深入理解 MySQL 中索引的基本实现,以及不同索引之间的区别,这样才能分析出如何设计最优的索引,最大幅度地提升Query的执行效率。
在 MySQL 中,主要有4种类型的索引,分别为:B-Tree 索引、Hash索引、Fulltext 索引和 R-Tree 索引。
B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。不仅在MySQL 中是如此,在其他的很多数据库管理系统中 B-Tree 索引也同样是作为最主要的索引类型的,这主要是因为 B-Tree索引的存储结构在
数据库的数据检索中有着非常优异的表现
一般来说,MySQL 中的 B-Tree 索引的物理文件大多是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的Leaf Node,而且到任何一个 Leaf Node的最短路径的长度都是完全相同的,所以把它称之为 B-Tree 索引。不过,可能各种数据库(或 MySQL 的各种存储引擎)在存放自己的 B-Tree 索引的时候会对存储结构稍作改造。如 InnoDB 存储引擎的 B-Tree 索引使用的存储结构实际上是 B+Tree,在 B-Tree 数据结构的基础上做了很小的改造,在每一个 Leaf Node 上面除了存放索引键的相关信息之外,还存储了指向与该 Leaf Node 相邻的后一个 Leaf Node 的指针信息,这主要是为了加快检索多个相邻 Leaf Node 的效率。
在 InnoDB 存储引擎中,存在两种不同形式的索引,一种是 Cluster 形式的主键索引(Primary Key),另外一种则是和其他存储引擎(如MyISAM存储引擎)存放形式基本相同的普通 B-Tree 索引,这种索引在 InnoDB 存储引擎中被称为 Secondary Index。下面通过图8-1针对这两种索引的存放形式做一个比较。
图8-1左侧为Clustered 形式存放的 Primary Key,右侧则为普通的 B-Tree 索引。两种索引在 Root Node 和Branch Nodes 方面完全一样。但它们会在Leaf Nodes方面出现差异。在 Primary Key 中,Leaf Nodes 存放的是表的实际数据,不仅仅包括主键字段的数据,还包括其他字段的数据,整个数据以主键值有序的排列。而 Secondary Index 则和其他普通的 B-Tree 索引没有太大的差异,只是在 Leaf Nodes除了存放索引键的相关信息外,还存放了 InnoDB 的主键值。
所以,在 InnoDB 中如果通过主键来访问数据效率是非常高的,而如果是通过 Secondary Index 来访问数据的话,InnoDB 首先通过 Secondary Index 的相关信息及相应的索引键检索到 Leaf Node,再通过Leaf Node 中存放的主键值和主键索引来获取相应的数据行
- Mysql B-Tree 索引
- mysql b-tree索引
- mysql b-tree索引
- Mysql InnoDB B+Tree索引
- mysql hash 索引 vs B-TREE 索引
- MYSQL 索引----B-Tree和全文索引
- mysql 索引类型详解-B-Tree索引
- B-Tree B+Tree mysql索引(MyISAM,InnoDB)
- MySQL索引使用的数据结构:B-Tree和B+Tree
- MySQL索引使用的数据结构:B-Tree和B+Tree
- MySQL索引使用的数据结构:B-Tree和B+Tree
- B-Tree / B+Tree 结构以及MySQL索引
- mysql索引->HASH索引和B-Tree索引
- mysql索引:b tree索引和hash索引的区别
- mysql索引hash索引和b-tree索引的区别
- mysql索引原理之B+/-Tree
- mysql索引原理之B+/-Tree
- MySQL教程-原理篇-B+Tree索引
- 解决多类库冲突——“$”变量冲突问题
- 输入关键字失去焦点后重新获得
- lsof查找放进linux回收站中的删除文件,并彻底删除或恢复文件
- 聚类分析中的距离度量
- createStatement()和createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)
- mysql b-tree索引
- 如何记住ASPxTreeView节点的展开状态
- 发现《计算机视觉-计算理论与算法基础》一书中的一处错误
- 2012年Web设计和开发的15个趋势
- Heap使用及GC_EXTERNAL_ALLOC含义
- struts2.2 json配置
- iOS的日历控件 开源代码整理
- 使用hook 拦截消息
- 增加列、列改主键、递增填充空列测试-sqlserver2008201203230953