MySQL采用B+树存储数据,原因如下:
- B+树数据都存储在叶子结点,从而非叶子结点能存储更多的索引数据,从而能够降低数据结构的树高,减少磁盘IO的次数。
- B+树是一种平衡树,对于增删改查都是logN级别的复杂度,有着良好的性能。
- B+树的叶节点是相互连接的,节点内和节点间的数据是顺序存储的,这很好得支持了数据的范围查询。
- 由于非叶子节点不存储数据,在查找数据时会将索引全部载入内存中,在查到对应数据后仅需一次磁盘IO操作即可获取到对应数据。
MyISAM引擎相对InnoDB引擎,其叶节点存储的数据是数据在磁盘的位置,其索引和数据是分两个文件*.MYI和*.MYD存储的;InnoDB的叶节点存储的数据就是实际的数据,其索引和数据在同一个文件*.ibd内。
聚集/聚簇索引:索引存储数据的一种方式,索引与数据一同存储,叶子结点中包含所有的数据。
非聚集索引:索引与数据分开存储。
二级索引的叶子结点数据存储的是主键索引(若存在主键)。
推荐使用自增、整型的主键来构建表的原因:
- 需要存在主键:表通过主键来维护表的B+树结构。(若不存在任何键,则MySQL会为表新增一个隐藏字段row_id来维护表结构)
- 整型主键:在比较时整型数据比较的效率更高。
- 自增主键:使用自增主键能避免表数据节点的频繁分裂,提升插入数据的效率。
最左前缀原则:若需使用联合索引,需从左开始依次使用对应字段不可跳过。
表关联查询:使用时要慎重。因为关联查询时即使使用到了索引,数据库内部在做关联时也可能会使用到许多算法执行大量不必要的计算。(可以多写Java/nodeJS等代码实现相同查询功能,因为相对而言数据库扩容比其他模块的扩容要复杂得多)