MySQL 性能优化

1. 索引

1.1 索引结构

1.1.1 二叉树

​ 有序列表无用

1.1.2 红黑树

​ 数据量大时 树高不可控

1.1.3 B+ 树

​ 非叶子节点不存数据,只存索引,叶子节点包含所有索引

image-20211231170346364

1.2 存储引擎

1.2.1 MyISAM

​ .frm 表结构 .MYD 表数据 . MYI 表索引

1.2.2 Innodb

​ .frm 存储表结构 .ibd 存储表数据 索引

​ myIsam 叶子节点放索引地址

​ innodb 存放整行数据

​ 聚集索引 叶节点包含完整记录

​ 非聚集索引 索引和数据分开保存

​ 主键索引都是聚集索引

​ 非主键索引 存的为主键字段

image-20211231184441753

  1. innodb 尽量使用主键

​ ibd 索引都是 b+ 树都是主键,即使不建主键,也会自己查找唯一值的创建或直接创建 rowid 来作为主键

  1. 为什么要用整型自增

    b+ 树比大小更方便,更快速

    自增,在新增索引时永远是插入末尾。如果非自增,插满的时候会插入中间位置导致分裂

    uuid 太长了,占用空间大

    msql 还使用了 hash 索引,

    hash 索引 时间复杂度为常量

    ​ hash() 完后取模,存入对应桶里的链表,

    ​ 但不支持范围查找

    b+ 树默认排列,同时每段索引的末端会保存下一段和上一段索引的磁盘地址

    方便范围查找

联合索引的底层实现?

从第一个往后走,必须要带前一个,

image-20211231191854535

因为排序是从第一个开始依次往后排序,字段的顺序查找保证了底层索引查询的有序性

长期运行时大量搜索结果的保存

冗余索引放入内存方便查询,叶节点存数据

  1. B+ 树和 B 树的区别

    B+ 树对非叶子节点只保存索引信息,同时在叶子节点保留所有信息