MySQL的MyISAM、InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”)。
索引结构的选择基于这样一个性质:大数据量时,索引无法全部装入内存。
为什么索引无法全部装入内存?假设使用树结构组织索引,简单估算一下:
- 假设单个索引节点12B,1000w个数据行,unique索引,则叶子节点共占约100MB,整棵树最多200MB。
- 假设一行数据占用200B,则数据共占约2G。
假设索引存储在内存中。也就是说,每在物理盘上保存2G的数据,就要占用200MB的内存,索引:数据的占用比
约为1/10。1/10的占用比算不算大呢?物理盘比内存廉价的多,以一台内存16G硬盘1T的服务器为例,如果要存满1T的硬盘,至少需要100G的内存,远大于16G。
考虑到一个表上可能有多个索引、联合索引、数据行占用更小等情况,实际的占用比通常大于1/10,某些时候能达到1/3。在基于索引的存储架构中,索引:数据的占用比
过高,因此,索引无法全部装入内存。