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



  

相关话题

  为什么不少程序员极度推崇 Vim 和 Emacs,却对 IDE 嗤之以鼻? 
  学编程什么的需要专业版Windows吗? 
  为什么有很多人执着于中文编程? 
  为什么很多公司都开始去 Oracle 而使用 MySQL? 
  有没有人考虑付费金额与代码量成反比会发生什么? 
  什么理由让代码保存为GBK? 
  怎样学范畴论? 
  在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进? 
  如何快速地在windows上部署Python开发环境,包括各种常用的第三方库? 
  golang,告警业务,每个告警源都有不同的分发频率,告警源可能新增or删除,该如何设计? 

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





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利