2017-02-21 113 views
0

我想知道關於mysql體系結構的一些事情。 1. sql過程如何在索引表中插入,刪除和更新操作? 2.據說只有在索引頁不在緩衝池中時纔在更改緩衝區中進行更改。因此,如果在緩衝池加載相關索引頁後進行更改,那麼它必須更改磁盤中的相同頁面。對?所以一個操作必須在三個不同的地方完成? 3.如何將NULL值編入索引?他們將在哪裏存儲在b +樹? 4.如果我們更新一個聚集索引的數據,那麼它何時會在磁盤中更新? 5.批量加載過程中會發生什麼?在sql中插入,刪除和更新過程中會發生什麼?

+3

如果這個問題只是關於[tag:mysql],爲什麼[tag:sql-server]標籤? –

+0

這些是相當多的問題。由於需要太多的內容,有些人可能會辭職來編寫答案。你也需要有人自信回答各方面的質疑。你爲什麼不在不同的問題中組織和分割主題? –

回答

1

如何處理插入/更新/刪除...

  1. 取(和緩存)需要定位的行(或多個)的索引塊(一個或多個)進行更新/刪除,或塊,其中新行將被插入。
  2. 取出數據塊。請注意,所有索引都包含與數據集羣的PRIMARY KEY
  3. 修改數據塊以反映更改。還處理記憶舊數據 - 在最終的情況下ROLLBACK
  4. 更新唯一索引塊(包括PK)。
  5. 在更改緩衝區中存儲非唯一索引更改。 (如您所述)

更改緩衝區被設計爲對實際索引塊「透明」。

  • 通過索引進行查找將始終「做正確的事情」,無論該條目是否在CB中。
  • 將CB條目摺疊回實際索引塊是在「背景」和/或空間不足時完成的。 (我認爲CB默認爲buffer_pool的1/4。)
  • 足夠的信息存儲在事務日誌中,這樣崩潰不會丟失掛起的索引更新。
  • 顯然,CB是爲了表現而發明的。與需要更新的索引塊(16KB)相比,索引更新可能會延遲,同時佔用更少的空間(通常只有幾十個字節)。多個更改(通常)可以應用於單個索引塊 - 這是主要的節省。但是請注意,由於隨機性,UUID,MD5等不能很好地利用CB。當前日期時間/時間戳上的非唯一索引是CB的緩衝真正發光的情況。

(對不起,我的CB的知識是有點模糊在你問的水平。我建議你閱讀的代碼。)

NULL ...我相信這是一個處理在B +樹中的所有非空值之前排序的單獨值。但是爲了混淆這個問題,有一個標誌確定零點是否被視爲彼此相等。並且PRIMARY/UNIQUE鍵有限制。

相關的空...當上DATEDATETIME一些變種/功能做PARTITION BY RANGE,無效日期變成NULL,這是明確地存儲在「第一」分區。新手常常困惑,爲什麼分割修剪似乎不起作用。 (推薦的部分解決方法:有一個「第一」分區,否則爲空。)

集羣UNIQUE指數...所有(?)寫操作必須檢查所有獨特指標,因此CB是不參與這樣的。注意:在InnoDB中,PRIMARY KEY始終是羣集且唯一的,並且不能(?)具有NULLs

大宗loading ...我發現100行INSERT將運行10倍的速度100個人INSERTs。 (這是由於解析等原因造成的)。但在低級別上,批量插入或LOAD DATA只是一堆單獨的插入。所以,上述討論適用。

獎金答案...

「IODKU」(INSERT ... ON DUPLICATE KEY UPDATE)是相當多遵循上述1..5步驟。在查找要更新的行時,它會發現是更新還是插入,然後相應地繼續。

REPLACE確實是DELETE的簡寫,加上UPDATE。但請注意這種異常...如果表格上有兩個唯一鍵,則在插入1行之前,一行REPLACE可能會刪除2行。

+0

感謝您花時間回答問題。你能建議我可以在哪裏瞭解更多關於這樣的內部事物嗎? @Rick James –

+0

Percona.com博客上的很多東西。我認爲傑里米科爾在CB上有一個博客。 –

+0

謝謝。 @瑞克詹姆斯 –

相關問題