百科问答小站 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/?



  

相关话题

  为什么 Python(或 Ruby、Perl 等)没有取代 Bash 成为系统 Shell? 
  计算机系为什么要学数据库原理和设计? 
  你最痛苦的一次找程序 bug 的经历是哪次? 
  为什么没有人实现 P2P 数据库? 
  用 vim 能写大型程序吗? 
  不懂就问:Linux、安卓和鸿蒙到底是什么关系? 
  程序员反感(讨厌、不喜欢)什么? 
  0基础开始,Leetcode200道题要多久左右? 
  「传输自动生成代码并执行、生成所需文件」能否成为未来的下载方式? 
  汉语编程只需要学习几十个汉字就可以编程了,外国人为什么不能汉语编程呢? 

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





© 2025-01-27 - tinynew.org. All Rights Reserved.
© 2025-01-27 - tinynew.org. 保留所有权利