Mysql innodb 为何建议使用自增列作为主键
所属分类 mysql
浏览量 1337
如果定义了主键(PRIMARY KEY),InnoDB会选择主键作为聚集索引。
如果没有显式定义主键,InnoDB选择第一个不包含有NULL值的唯一索引作为主键索引。
如果没有这样的唯一索引,InnoDB选择内置6字节长的ROWID作为隐含的聚集索引
(ROWID递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
聚集索引 数据的物理顺序与键的顺序相同。一个表只能有一个聚集索引,聚集索引速度快。
聚集索引也称为聚簇索引(Clustered Index)
oracle一般使用堆表,mysql的innodb是索引组织表
堆表以一种随机的方式管理,数据插入时时存储位置是随机的,主要由数据库内部块的空闲情况决定,数据会放在最合适的地方,而不是以某种特定顺序来放置。
堆表不用考虑排序, 存储速度会比较快.
堆表索引中记录了记录所在位置的rowid,查找的时候先找索引,然后再根据索引rowid找到数据。
堆表的索引和表数据是分离的
索引组织表索引和数据是在一起的
索引组织表,其行数据以索引形式存放,因此找到索引,就等于找到了行数据。
堆组织表(Heap Organize Table, HOT)
索引组织表(Index Organized Table, IOT)
数据记录本身存于主索引(一颗B+Tree)的叶子节点上,
同一个页内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,
因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,
如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)
使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
如果使用非自增主键,新记录会被插到现有索引页的中间某个位置 需要移动数据
频繁的移动、分页操作造成了大量的碎片, 产生不够紧凑的索引结构,
后续可以通过OPTIMIZE TABLE来重建表并优化填充页面。
上一篇
下一篇
git diff 命令
git reset 版本回退
redis集群方案
redis使用zset保留最近的数据
B+树 与 B树 索引
B树与红黑树,为什么数据库使用B树索引