百科问答小站 logo
百科问答小站 font logo



设计 MySQL 数据表的时候一般都有一列为自增 ID,这样设计原因是什么,有什么好处? 第1页

  

user avatar   quxl 网友的相关建议: 
      

MyISAM/InnoDB默认用B-Tree索引(可理解为"排好序的快速查找结构")。

InnoDB中,主索引文件上直接存放该行数据,称为聚簇索引。次索引指向对主键的引用;

MyISAM中,主索引和次索引,都指向物理行(磁盘位置);

注意: 对InnoDB来说

1: 主键索引既存储索引值,又在叶子中存储行的数据;

2: 如果没有定义主键,则会使用非空的UNIQUE键做主键 ; 如果没有非空的UNIQUE键,则系统生成一个6字节的rowid做主键;

聚簇索引中,N行形成一个页。如果碰到不规则数据插入时,会造成频繁的页分裂(因为索引要排好序),插入速度比较慢。所以聚簇索引的主键值应尽量是连续增长的值,而不是随机值(不要用随机字符串或UUID),否则会造成大量的页分裂与页移动。

故对于InnoDB的主键,尽量用整型,而且是递增的整型。这样在存储/查询上都是非常高效的。


user avatar   yang 网友的相关建议: 
      

数据库表一般使用 B+树索引, B+树的叶子节点存放所有指向关键字的指针,节点内部关键字记录和节点之间都根据关键字的大小排列。

当顺序递增插入的时候,只有最后一个节点会在满掉的时候引起索引分裂,此时无需移动记录,只需创建一个新的节点即可。而当非递增插入的时候,会使得旧的节点分裂,还可能伴随移动记录,以便使得新数据能够插入其中。

一般建议使用一列顺序递增的 ID 来作为主键,但不必是数据库的autoincrement字段,只要满足顺序增加即可,如 twitter 的 snowflake 即为顺序递增的 ID 生成器。

Update: 这里有一篇博客,图文并茂讲的很清楚

hedengcheng.com/?



  

相关话题

  有人号称编程零基础学C#4天,用记事本1分钟写个计算器,而且信誓旦旦,这是怎么回事? 
  有人号称编程零基础学C#4天,用记事本1分钟写个计算器,而且信誓旦旦,这是怎么回事? 
  你最痛苦的一次找程序 bug 的经历是哪次? 
  电脑存在“熟悉”某项任务后运行变快的情况吗? 
  在大学如何避免自我感动?如何学会更多的知识和技能? 
  为什么学习编程第一课要学习输出"hello, world"?这是谁规定的? 
  以下我关于虚拟地址与物理地址的理解是正确的吗? 
  为什么中国的计算机教育这么落后? 
  中国的程序员数量是否已经饱和或者过剩? 
  孩子一年级成绩不理想,朋友建议可以学学少儿编程,学习少儿编程对提高孩子的逻辑思维能力真的有帮助吗? 

前一个讨论
如何看待魅族招聘程序员鼓励师?
下一个讨论
如何看待支付宝新施行的支付密码只能修改为六位纯数字密码?





© 2025-04-18 - tinynew.org. All Rights Reserved.
© 2025-04-18 - tinynew.org. 保留所有权利