zoukankan      html  css  js  c++  java
  • InnoDB的主键选择与插入优化

    索引的存放方式
    MyISAM和InnoDB存储引擎
    在MySQL中,不同存储引擎对索引的实现方式是不同的,总结下MyISAM和InnoDB两个存储引擎的索引实现方式。
    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。

    第一列作为主索引的MyISAM引擎存储结构,要求主索引取值唯一。

    虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM不同。InnoDB的叶子节点的数据域保存了完整的数据记录,索引的key是数据表的主键

    InnoDB的主键选择与插入优化
    在使用InnoDB存储引擎时,建议使用一个与业务无关的自增字段作为主键。
    InnoDB将数据记录本身存于主索引(一颗B+Tree)的叶子节点上。每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如下图所示:

    这样就会形成一个紧凑的索引结构,近似顺序填满。
    如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:

    此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
    因此,只要可以,请尽量在InnoDB上采用自增字段做主键。

  • 相关阅读:
    20210309-2 阅读任务
    20210309-1 准备工作
    课程总结
    第十四周课程总结&实验报告(简单记事本的实现)
    十三周课程总结
    十二周课程总结
    第十一周课程总结
    C语言ll作业01
    C语言寒假大作战04
    C语言寒假大作战03
  • 原文地址:https://www.cnblogs.com/zhs0/p/10521640.html
Copyright © 2011-2022 走看看