索引是什么
索引数据结构
数据记录在磁盘上,数据的存储位置并不连续,
- 二叉树 :对于自增的数据,二叉树会变成一个链表(二叉树右分支的数据总比父节点的大)

- 红黑树:二叉平衡树(对于自增的数据且数据量组件增加后,树高会过高,且不可控)

- B-Tree:

- B+Trtee

- Hash表
将索引进行一次hash运算,存储到hash桶中,并将数据存放地址一并存入
查看mysql文件页大小(16K):SHOW GLOBAL STATUS like ‘Innodb_page_size’;
为什么mysql页文件默认16K?
假设我们一行数据大小为1K,那么一页就能存16条数据,也就是一个叶子节点能存16条数据;再看非叶子节点,假设主键ID为bigint类型,那么长度为8B,指针大小在Innodb源码中为6B,一共就是14B,那么一页里就可以存储16K/14=1170个(主键+指针)
那么一颗高度为2的B+树能存储的数据为:117016=18720条,一颗高度为3的B+树能存储的数据为:11701170*16=21902400(千万级条)
存储引擎
聚集索引/聚簇索引:索引和数据文件位于同一个文件的存储方式
非聚集索引/非聚簇索引:索引和数据文件分开存储的方式
MyISAM:索引文件与数据文件是分离的(非聚集)
文件结构:
XXX.frm(表结构信息)
XXX.MYD(表数据)
XXX.MYI(表索引)
查询index==100的数据—>在MYI中通过在B+树中查找,找到值为100的节点所对应的data数据该data数据存放的是该条数据在MYD中的磁盘地址;
InnoDB(聚集):
XXX.frm(表结构信息)
XXX.idb(表数据+表索引)
实现:
表数据文件本身就是按B+Tree组织的一个索引结构文件
聚集索引-叶节点包含了完整的数据记录
为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
由于数据存储的结构为B+树,而根节点中存放的索引值就可以是不能重复的主键的值;如果没有主键InnoDB会尝试获取数据中某一列完全不相等的数据作为索引值,倘若没找到。就会自动生成一列隐藏列来完成B+树的构成,所以建议由我们自己建立主键;
整型占用空间比例如String占用小,相同空间可以存储更多索引数据
为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
