柬埔寨旅游网站建设,企业培训,网站建设时间怎样看,网站程序什么是页分裂#xff1f;
如果我们使用非自增主键#xff0c;由于每次插入主键的索引值都是随机的#xff08;比如 UUID#xff09;#xff0c;因此每次插入新的数据时#xff0c;就可能会插入到现有数据页中间的某个位置#xff0c;这将不得不移动其它数据来满足新数据…什么是页分裂
如果我们使用非自增主键由于每次插入主键的索引值都是随机的比如 UUID因此每次插入新的数据时就可能会插入到现有数据页中间的某个位置这将不得不移动其它数据来满足新数据的插入甚至需要从一个页面复制数据到另外一个页面我们通常将这种情况称为页分裂。
页分裂还有可能会造成大量的内存碎片导致索引结构不紧凑从而影响查询效率。
举个例子假设某个数据页中的数据是1、5、9、10且数据页满了现在准备插入一个数据6则需要把数据页分割为两个数据页 出现页分裂时需要将一个页的记录移动到另外一个页性能会受到影响同时页空间的利用率下降造成存储空间的浪费。
而如果记录是顺序插入的例如插入数据11则只需开辟新的数据页也就不会发生页分裂 因此在使用 InnoDB 存储引擎时如果没有特别的业务需求建议使用自增字段作为主键。
insert 操作对 B 树结构的改变是什么样的 如果我们使用主键是顺序递增那么每次插入的新数据就会顺序插入到叶子节点最右边的节点里如果该页面满了就会自动开辟一个新页面将新数据插入到新页面。因为每次插入一条新记录都是追加操作不需要重新移动数据因此这种插入数据的方法效率非常高。 如果我们使用主键不是顺序递增由于每次插入主键的索引值都是随机的因此每次插入新的数据时就可能会插入到现有数据页中间的某个位置这时候为了保证B 树的有序性要移动其它数据来满足新数据的插入如果该页面满了就发生页分裂这时候要从一个页面复制数据到另外一个页面目的是保证后一个数据页中的所有行主键值比前一个数据页中主键值大页分裂可能会造成大量的内存碎片导致索引结构不紧凑从而影响查询效率。
所以我们在设计主键的时候最好采用自增的方式或者顺序递增主键值。另外主键字段的长度不要太大因为主键字段长度越小意味着二级索引的叶子节点越小二级索引的叶子节点存放的数据是主键值这样二级索引占用的空间也就越小。