用 InnoDB 時關於 PRIMARY KEY 的建議

标签: Computer Database Murmuring MySQL Software | 发表时间:2013-10-19 21:29 | 作者:Gea-Suan Lin
出处:http://blog.gslin.org

Percona 的「 InnoDB scalability issues due to tables without primary keys」這篇文章在討論 InnoDB 在沒有 PRIMARY KEY 時的效能問題。

在討論效能問題前,應該先讀過 MySQL 官方文件裡提到 InnoDB index 架構的文章,其中就有提到 PRIMARY KEY 以及其他的 INDEX KEY 的底層架構:「 InnoDB Table and Index Structures」。

InnoDB 是 clustered index 架構 (關於 clustered index 的完整說明,可以參考維基百科的「 Database index」條目),也就是說,資料本身 (row data) 存放時會按照某個順序存放,這邊的順序是按照這樣的方式定義的:

  • 如果你有指定 PRIMARY KEY,那麼就會直接用 PRIMARY KEY 當作 clustered index。
  • 如果沒有指定 PRIMARY KEY,但有 UNIQUE INDEX,而且所有欄位都是 NOT NULL,那麼就用這組 UNIQUE INDEX (NOT NULL) 當作 clustered index。
  • 如果都沒有指定 PRIMARY KEY,那麼就會產生一個隱藏的欄位,是一個 6 bytes 的 auto increment 的數字,用這個欄位當 clustered index。也因為如此,在這種情況下,資料會依照建立的順序存放。

另外,InnoDB 的 secondary index 會指到 PRIMARY KEY (B+Tree 的 value 部分是放 PRIMARY KEY)。

所以,一般在規劃資料庫時建議的作法是:

  • 所有的表格都要有 PRIMARY KEY。
  • PRIMARY KEY 必須是 INT UNSIGNED (4 bytes),只有在需要 BIGINT UNSIGNED (8 bytes)的時候才用 BIGINT UNSIGNED。

對於有大量 secondary index 的表格更應該這樣做 (因為可以省下大量空間)。而對於現代的 ORM 來說,也都幾乎要求要有 PRIMARY KEY,甚至有些 ORM 要求 PRIMARY KEY 必須是 single column。

如果你都能了解後,再去看 Percona 討論沒有 PRIMARY KEY 的情況時,才能了解他們想要討論什麼事情… 裡面還包含了 InnoDB 格式的差異。

Related Posts:

相关 [innodb primary key] 推荐:

用 InnoDB 時關於 PRIMARY KEY 的建議

- - Gea-Suan Lin's BLOG
Percona 的「 InnoDB scalability issues due to tables without primary keys」這篇文章在討論 InnoDB 在沒有 PRIMARY KEY 時的效能問題. 在討論效能問題前,應該先讀過 MySQL 官方文件裡提到 InnoDB index 架構的文章,其中就有提到 PRIMARY KEY 以及其他的 INDEX KEY 的底層架構:「 InnoDB Table and Index Structures」.

Mysql InnoDB锁

- - 数据库 - ITeye博客
抄自:http://www.cnblogs.com/qq78292959/archive/2013/01/30/2882745.html. Mysql常用存储引擎的锁机制. MyISAM和MEMORY采用表级锁(table-level locking). BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁.

镀金键盘帽:Gold Key

- Paul - 爱…稀奇~{新鲜:科技:创意:有趣}
传统上而言,判断一个人是不是暴发户,最主要不是看小三的数量,也不是看有没有玛莎拉蒂,最重要的是——看他有没有一颗金牙. 这在改革刚开放那会,一颗金灿灿的门牙,简直就是“老子很有钱”的代名词,可比名片管用多了~. 所以,从这个角度而言,如果你怀念着那个光辉的时代,并想给自己来点后现代的色彩,那么,一颗镀金键盘帽(Gold Key)就是必须的了~4美元一颗,这里有售:chihapaura.com,用来替换自己键盘上的数字“4”,那“仇恨”吸得,我kao,即便是美美也不过如是啊.

mysql中的ON DUPLICATE KEY UPDATE

- - haohtml's blog
INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢. 前提条件是这个表必须有一个唯一索引或主键. 1、REPLACE发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空.

Tair: 淘宝的key/value解决方案

- duxin - 若海的blog
今天我们对外开源了Tair,Tair是由淘宝开发的key/value解决方案,你可以在这里获取更多信息. Tair在淘宝有着大规模的应用,在你登录淘宝、查看商品详情页面、在淘江湖和好友“捣浆糊”等等时候,后面都在直接或间接的和Tair交互. Tair是一个分布式的key/value结构数据的解决方案,系统默认支持基于内存和文件的存储引擎,对应于通常我们所说的缓存和持久化存储.

给钥匙加上套子:Key Keeper

- Chuyue - 爱…稀奇~{新鲜:科技:创意:有趣}
来自日本设计师青木亮作(Ryosaku Aoki)的创意,Key Keeper是给钥匙用的硅胶TT——能干嘛呢. 在平时,它可以一定程度地将钥匙的棱角包裹起来(兼具防尘的作用),避免运动或者玩闹时不小心戳到自己,或者划伤手机外壳,同时多样的色彩又会是漂亮的分类标签,一种颜色对应一种钥匙~并且丝毫不会影响到钥匙本来的功能,开门的时候握住一头,仍然能轻松地插进钥匙孔,这时,Key Keeper会缩回,等抽出钥匙的时候它又能自动弹回.

Cloud Key,躲在 U 盘里的云

- SotongDJ - 爱范儿 · Beats of Bits
看看 Goolge 建立了多少个数据中心. 搭建云服务,需要要众多的服务器吧. 然而位于旧金山的 Piston 推出新产品 Cloud Key,把云服务装进了 U 盘. 那么,Cloud Key 能否像 U 盘那样方便易用呢. 根据公司描述,当 Cloud Key 插进交换机后,只需要短短几分钟,用户就能够完成云计算平台 OpenStack 的设置.

mysql Key_buffer_size参数的设置

- - 开心平淡对待每一天。热爱生活
   在mysql数据库中, mysql key_buffer_size是对MyISAM表性能影响最大的一个参数,下面就将对mysql Key_buffer_size参数的设置进行详细介绍,供您参考. 下面一台以MyISAM为主要存储引擎服务器的配置:. 分配了512MB内存给mysql key_buffer_size,我们再看一下key_buffer_size的使用情况:.

Mysql Innodb 引擎优化

- 彦强 - 阿辉的空间
作/译者:吴炳锡,来源:http://imysql.cn/ & http://www.mysqlsupport.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎. InnoDB锁定在行级并且也在SELECT语句提供 一个Oracle风格一致的非锁定读.

MySQL InnoDB B+树索引

- - OurMySQL
B+树索引在DB中有一个特点就是高扇出性,一般在DB中B+树的高度在2-3层左右,也就意味着只需要2-3次的IO操作即可. 而现在的磁盘每秒差不多在100次IO左右,2-3次意味着查询时间只需0.02-0.03秒. InnoDB存储引擎表是索引组织表,即表中数据安装主键顺序存放. 而聚集索引就是按照每张表的主键构造一颗B+,并且叶节点存放着整张表的行记录数据,因此也让聚集索引也是索引的一部分.