![](/img/trans.png)
[英]is it good to use combined primary key for MySQL InnoDB clustered index?
[英]InnoDB clustered index performance when using random values as primary key
默認情況下,我的InnoDB存儲引擎的主鍵是自動遞增整數。 為了隱藏數據庫中的行數,應用程序代碼為主鍵實現了一些隨機生成器。
這是典型方案的示例:
CREATE TABLE `MUSIC_LINK` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`project_id` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;
我正在讀一本書,才發現InnoDB使用按主鍵排序的聚簇索引。 本質上,這意味着數據庫文件中的記錄由主鍵值索引和排序。 只要下一條記錄的主鍵始終大於插入的最后一條記錄(這是默認情況下,由於自動增量約束),就很好。
當主鍵不再自動遞增時會發生什么? 為了使文件按主鍵排序,每次插入小於最大主鍵的主鍵時,都必須進行大量重寫。
我是否誤解了聚集索引如何在InnoDB中工作? 因為這聽起來像一個巨大的性能問題。
InnoDB:
使用AUTO_INCREMENT
PRIMARY KEY
,“下一個”行將放置在保存表數據的BTree的“末尾”。 這是有效的,並且“最后一個”塊將被大量更新。
注意:塊保留在buffer_pool中, 最終將它們寫入磁盤。
對於GUID,UUID,MD5,SHA1等“隨機” PK,要插入的“下一個”行需要進入保存數據的BTree中的某個“隨機”位置。 如果buffer_pool足夠大,則必要的塊仍將位於其中。 因此,效率與AI並沒有太大不同。
另一方面,如果數據太大而無法容納到buffer_pool中(或者其他活動使塊不斷溢出),則插入將需要在修改塊之前獲取該塊。
例如,如果該表的大小是buffer_pool中可容納的大小的20倍,則下一次隨機寫入將有20的緩存塊中有1的機會。 也就是說,在INSERT
有95%的時間必須等待磁盤讀取。
但是...您引發了對INSERTs
的討論。 SELECTs
呢? 選擇有什么模式(如果有)? 如果仍然是“隨機”,則PK的類型無關緊要。 另一方面,如果選擇傾向於到達“最近”項(例如新聞),則AI對於大型表將獲勝,因為緩存了所需塊的可能性增加了。
簇
評論暗示對“集群/ ed / ing”有些困惑。 一些定義(在MySQL / MariaDB上下文中):
所以,回到評論:
PRIMARY KEY
跳轉(由於使用了我所謂的隨機PK,或者只是由於未按某些相關順序獲取行)被卡在了表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.