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



  

相关话题

  为什么最近十年发明的编程语言都喜欢先变量名后类型声明这种变量声明方式? 
  同是主流操作系统,为什么macOS没有盗版系统而Windows到处是盗版? 
  当你学会了什么之后感觉自己的编程算是入门了? 
  如何修改shared_ptr智能指针,让他支持多线程? 
  我听说以前的系统没有图形界面,那他们是用 C# 等语言直接敲代码吗? 
  怎么用一行代码让老板开除你? 
  为什么不能能向方法同时传入dynamic 类型,和lambda类型的参数? 
  假如用汇编语言重制某游戏或者软件能否降低 CPU 性能损耗? 
  能用电脑模拟计划生育后人口的变化吗? 
  假设开发某款软件1个程序员10天可以做好,那么找10个同等水平程序员一起做1天能否做好? 

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





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利