What's the index?
- 索引是帮助MySql高效获取数据的排好序的数据结构
- 索引存储在文件里
- 索引有很多不同的结构(BineryTree/Hash/BTree)
Why B+Tree is been used until now?
*BineryTree:没有自动调整功能,如果一直分别加入排序的数据(1-2-3-4-5-6-...),会演变成链表,就失去了索引的意义了。
*HASH:查找一行可以使用,但是对于范围查找无力。
*RedBlackTree:数据多的时候高度会过高,导致时间复杂度过高。
*B-Tree:让红黑树从纵向发展转变成横向发展,一个结点存储多个数据。但是上层结点存储了完整数据记录,导致度数低。
CPU一般一次I/O将整个结点放入内存进行查找索引的位置,所以在结点中查找的时间几乎可以忽略不计,所以结点数中的数据个数应该越多越好,所以data中应该不存完整的数据记录
*B+Tree:
Something about MyISAM and InnoDB..
对于MyISAM,其索引文件和数据文件不是同一个文件,所以data中存放的是数据地址
*非主键索引和主键索引一样,data存放的都是数据地址,每一个非主键索引都有单独的B+Tree
InnoDB:数据和索引存放在同一文件-->data中存放的是完整的数据记录--->将所有数据聚集在一起(聚簇索引)
--->查找速度更快--->相对MyISAM减少了一次查找(地址-数据)
*非主键索引data存储的是主键,不是完整的数据记录
InnoDB索引实现(聚集索引)
- 数据文件本身就是索引文件
- 表数据文件本身就是B+Tree组织的一个索引结构文件
- 聚集索引的叶子节点包含了完整的数据记录
- 为什么InnoDB表必须有主键,并且推荐使用整形的自增主键
*自增:这样可以让新增的数据插入到最后,防止数据插入在中间导致分页增加时间
*整形:节省比较时间(可比较与uuid)
- 为什么非主键索引结构叶子结点存储的是主键值
*一致性:如果一个存的不是主键(数据记录),更改一个数据,就要把所有索引都更改一遍
*节省存储空间:只存一个主键肯定节省存储空间啦~