一、索引数据结构
- 索引是排好序的数据结构,帮助MySQL高效获取数据
索引的数据结构有四种
- 二叉树
- 红黑树
- Hash表
- B-树
重点描述B树,还有B树的升级版—B+树,B+树是MySql索引主要的储存结构,Hash表在很少用,主要是Hash表不支持范围查找
- B-树
- 叶节点具有相同的深度,叶节点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排列
- B+树(B树的升级)
- 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能
- B树与B+树的区别
- 叶子节点:
B树的叶子节点是独立的,B+树的叶子节点之间通过指针连接且叶子节点包含了索引字段 - 非叶子节点:
B+数的非叶子节点储存(冗余)了父节点的指针左边的索引,只存储了索引,不存储数据,B树的非叶子节点储存了索引及数据 - 数据储存
B树的非叶子节点储存了索引数据,B+树的非叶子节点只储存索引,相同的内存空间,B+树存放了更多的索引,储存同数量数量的索引B+树的深度比B数要低
- Hash表
- 对索引的key进行hash算法散列出储存的位置
- Hash表比B+树更加高效
- 不支持范围查询, 仅能满足 “=”,“IN”关键字
- hash冲突问题
二、innoDB与MyISAM(储存引擎)
MyISAM索引实现
-
MyISAM储存引擎主要的组成:
- 结构文件
- 数据文件
- 索引文件
-
非聚集索引
数据文件和索引文件单独的文件称为非聚集 -
新建表user选择引擎未MylSAM
-
找到本地储存表的文件
- user.frm(结构文件):储存表的数据结构类型(比如age的int类型,name的varchar类型)
- user.MYD(数据文件):储存表属性的数据(age的数据和name的数据)
- user.MYI(索引文件):储存表的索引和数据行的地址
- 索引文件的储存
MyISAM索引文件的叶子节点所在索引储存了指向数据行的地址文件
innoDB索引实现
-
MyISAM储存引擎主要的组成:
- 结构文件
- 数据文件
- 索引文件
-
非聚集索引
数据文件和索引文件单独的文件称为非聚集 -
新建一张部门表dept,储存引擎选择innoDB
-
找到本地储存表的文件
- user.frm(结构文件):储存表的数据结构类型(比如age的int类型,name的varchar类型)
- user.idb(索引数据文件):储存表的索引和数据
- 索引数据文件的储存
索引数据文件的叶子节点储存了所在索引的行数据
MyISAM和InnoDB的区别
- InnoDB支持事务, MyISAM不支持
- InnoDB支持行级锁, MyISAM支持表级锁
- InnoDB支持多版本并发控制(MVVC), MyISAM不支持
- InnoDB支持外键, MyISAM不支持
- MyISAM支持全文索引, InnoDB部分版本不支持(但可以使用Sphinx插件)
- MYISAM 表有三个文件: 索引文件、表结构文件、数据文件, InnoDB表有二个文件: 索引数据文件、表结构文件
- MYISAM采用非聚集索引, 索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致, 但是辅索引不用保证唯一性
- InnoDB采用聚集索引( 索引的数据域存储数据文件本身), 辅索引的数据域存储主键的值; 因此从辅索引查找数据, 需要先通过辅索引找到主键值, 再访问辅索引; 最好使用自增主键, 防止插入数据时, 为维持 B+树结构, 文件的大调整
二叉树和B+树这里没有讲的那么详细,侧重于整理MySql的索引实现和储存引擎
描述不对的地方帮忙指出!!!!