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



  

相关话题

  有哪些类似于易百教程,w3cschool,runoob的在线实例编程网站? 
  程序员有必要知道为什么做某个功能吗? 
  WPF中如何在Parallel.For中利用Dispatcher.Invoke实时更新进度条? 
  游戏开发的编程算不算是 IT 行业中难度最大的? 
  什么是 Functional Programming? 
  为什么著名的轮子很少有用 Lisp 写的? 
  C# 这么优秀的语言,现在到底出了什么问题? 
  既然有些人喜欢开挂,为啥不开发一款网游,提供编程接口,允许玩家自行用各种软件,同时允许计算机参与计算? 
  CPU 只能进行数值运算,那么计算机是怎么显示出字符的? 
  数学和编程中,「函数」的概念相同在哪里,不同在哪里? 

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





© 2024-06-01 - tinynew.org. All Rights Reserved.
© 2024-06-01 - tinynew.org. 保留所有权利