Java锁有哪些
乐观锁、悲观锁 如何实现
synchronize 和 cas 如何实现的
MySQL页分裂
MySQL分页查询时可能设计到的问题之一就是页分裂(Page Splitting)。
页分裂指的是在B+树索引结构中,当插入新的记录时,可能会导致索引页分裂成两个页面,从而影响索引的性能。(我们需要保证:后一个数据页中的所有主键值要比前一个数据页中的主键值大)
解决方法
- 合理的插入顺序:在进行大批量插入操作时,可以尽量按照索引的顺序进行插入,从而减少页分裂的可能性。例如,对于自增主键,插入时按照主键顺序插入
- 适当的页填充因子
- 定期重建索引
- 批量插入和事务管理:对于大批量插入操作,可以使用事务进行管理,并适时提交,以减少频繁的页分裂。
- 数据库版本和配置
MySQL页合并
MySQL中的页合并(Page Merging)是指在B+树索引结构中,当删除记录或者索引项后,可能导致索引页变得太空闲,从而触发合并操作,将相邻的页合并成一个更大的页,以优化索引性能和空间利用率。
页合并是一种优化操作,它可以减少索引树的深度,提高查询性能。
触发合并
当删除了一个记录或索引项后,会留下一个空闲的位置。当空闲位置过多,超过一定阈值时,MySQL 可能会触发页合并操作,将相邻的空闲页合并成一个更大的页。
合并策略
基于一种贪心算法,即尝试合并相邻的两个页,以便尽可能减少空闲页的数量。
InnoDB 的主索引文件中直接存放该行数据,称为聚簇索引,次索引(二级索引)指向对主键的引用;
MyISAM 的主索引和次索引,都指向物理行地址(磁盘位置);
InnoDB(聚簇索引)的主键值最好是有序的,不仅能充分使用到索引,还尽可能避免了页分裂;否则就必须进行页分裂来保证索引的逻辑正确性;
InnoDB 的主键,尽量使用连续增长的值,而不是随机值(比如随机字符串或UUID), 否则可能产生大量的页分裂;
InnoDB的B+树索引注意事项:根页面的位置万年不动,一个页面最少存储2条记录。
聚簇索引的叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键-ID)。
聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引。
聚簇索引一个表中只能有一个,而非聚簇索引则没有数量上的限制。