(非原创,整理得)
数据库的数据都放在磁盘上,磁盘IO是非常消耗性能的;
磁盘预读
每一次IO读取的数据我们称之为一页(page),一般为4k或8k;
每次读取磁盘都是按页(page)的整数倍。
为什么b+树要求把真实的数据放到叶子节点而不是内层节点
IO次数取决于b+树的高度h
b+数一个节点大小为一个页,保证读取一个节点,只会进行一次IO操作
一次load一个磁盘块,磁盘块的大小是固定的,单个数据占空间越小,就意味着一个磁盘块能放的数量越多,这样一层树的数据(索引)就越多,一层能放更多的索引,树的高度就越低,磁盘IO次数越少
这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半
最左匹配特性
mysql索引引擎
- MyISAM (非聚簇索引)
- InnoDB (聚簇索引)
聚簇索引:索引和数据文件为同一个文件。
非聚簇索引:索引和数据文件分开的索引。
InnoDB要求表必须有主键,按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得数据记录主键,然后用主键到主索引中检索获得数据记录。