准备


Java锁有哪些

乐观锁、悲观锁 如何实现

synchronize 和 cas 如何实现的

MySQL页分裂

MySQL分页查询时可能设计到的问题之一就是页分裂(Page Splitting)。
页分裂指的是在B+树索引结构中,当插入新的记录时,可能会导致索引页分裂成两个页面,从而影响索引的性能。(我们需要保证:后一个数据页中的所有主键值要比前一个数据页中的主键值大)

解决方法
  • 合理的插入顺序:在进行大批量插入操作时,可以尽量按照索引的顺序进行插入,从而减少页分裂的可能性。例如,对于自增主键,插入时按照主键顺序插入
  • 适当的页填充因子
  • 定期重建索引
  • 批量插入和事务管理:对于大批量插入操作,可以使用事务进行管理,并适时提交,以减少频繁的页分裂。
  • 数据库版本和配置

MySQL页合并

MySQL中的页合并(Page Merging)是指在B+树索引结构中,当删除记录或者索引项后,可能导致索引页变得太空闲,从而触发合并操作,将相邻的页合并成一个更大的页,以优化索引性能和空间利用率。

页合并是一种优化操作,它可以减少索引树的深度,提高查询性能。

触发合并

当删除了一个记录或索引项后,会留下一个空闲的位置。当空闲位置过多,超过一定阈值时,MySQL 可能会触发页合并操作,将相邻的空闲页合并成一个更大的页。

合并策略

基于一种贪心算法,即尝试合并相邻的两个页,以便尽可能减少空闲页的数量。

InnoDB 的主索引文件中直接存放该行数据,称为聚簇索引,次索引(二级索引)指向对主键的引用;
MyISAM 的主索引和次索引,都指向物理行地址(磁盘位置);
InnoDB(聚簇索引)的主键值最好是有序的,不仅能充分使用到索引,还尽可能避免了页分裂;否则就必须进行页分裂来保证索引的逻辑正确性;
InnoDB 的主键,尽量使用连续增长的值,而不是随机值(比如随机字符串或UUID), 否则可能产生大量的页分裂;
InnoDB的B+树索引注意事项:根页面的位置万年不动,一个页面最少存储2条记录。
聚簇索引的叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键-ID)。
聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引。
聚簇索引一个表中只能有一个,而非聚簇索引则没有数量上的限制。


文章作者: YoonaDa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YoonaDa !
  目录