簡體   English   中英

MySQL:對PK B +樹的無序插入要比對二級索引B +樹的無序插入慢嗎?

[英]MySQL: is out-of-order inserts into PK B+ Tree slower than out-of-order inserts into Secondary Index B+ Tree?

在MySQL中使用自動增量PK的主要原因之一是,它確保對集群PK索引的所有插入都將是有序的,因此是快速的。 我明白那個。

但是二級索引呢? 假設我的表格有二級索引。 插入將相對於PK聚集索引是有序的,而相對於二級索引B +樹則是無序的。

那么插入會不會仍然很慢,因為隨着插入的到來,MySQL需要不斷地重新排列二級索引B + Tree?

我只是想知道在這里使用自動增量是否真的能給我帶來任何性能上的好處。 在此將不勝感激。

主鍵將被群集,這意味着它直接指向磁盤上的數據。 必須重新排列數據意味着必須移走完整記錄。 對於二級索引,它實際上只是一堆指向磁盤上位置的指針。 次要索引與記錄的順序無關,因此必須在次要索引中移動指針只是移動指針。 這比必須移動完整記錄要快得多。

僅當您有一個只寫(或至少只更新)表時,您的基本假設才成立。 如果要刪除記錄,則新記錄的PK將無順序(物理地)插入。

索引插入的效率幾乎始終是次要的考慮因素,而將其弄亂則是過早的優化反模式。 您是否考慮過基數,關鍵字段長度,緩存大小等通常更為重要的問題?

首先,使用自動增量代理PK通常次優-通常會有一個更有用的唯一鍵,其真實值以更有意義的方式聚集。 (而且您只能與innodb表一起集群-您意識到了,對吧?)


“聚類”表示索引本質上表。 因此,在插入代理鍵時有一個好處,因為所有內容都會添加到表的末尾,因為下一個索引值始終比任何先前的索引值都要高(您已經知道)。

除非您要填補由已刪除的記錄創建的漏洞。 這可能是間接發生的,但可能是一個開銷問題,因為必須重新定位整個記錄,這顯然比僅移動索引鍵值和指針還要多。

對於單個記錄的查詢,對於記錄范圍而言(例如,訂單,客戶,用戶的項目),群集記錄並不能為查詢帶來太多好處。如果您可以為同一用戶選擇幾條(或幾百條)記錄,例如,這是值得聚類的。為單個用戶連續插入記錄(在大多數情況下)的可能性要小得多,因此按時間順序聚類無濟於事,但您的要求可能會有所不同。


您沒有指定innodb,所以我主要回答myisam(默認值),其中只有自動增量或按時間順序排列的索引會模擬聚類-沒有明確的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM