2016-09-19 25 views
1

根據MySQL手冊:SHOW TABLE STATUSInnoDB表的'Data_length'這句話有什麼不對嗎?

對於InnoDB,DATA_LENGTH是分配給簇索引,以字節爲單位的近似量的存儲器 。具體來說,這是 聚集索引大小(以頁爲單位)乘以InnoDB頁大小。

我感到困惑「的內存量」,因爲聚集索引存儲在磁盤上,而不是在內存中。

我認爲正確的表達應該如下:

對於InnoDB,DATA_LENGTH是近似量的分配給簇索引,以字節爲單位的磁盤空間

誰能幫我解釋一下「內存量」?

+2

當查詢正在處理時,索引被複制到內存中,所以磁盤空間和內存使用是同構的。 – Barmar

+0

@Barmar - 將_Blocks_複製到內存中,並將_cached_複製到那裏。你可以有一個大於內存容量的索引。 –

+0

應該可能是「存儲量」。 – tadman

回答

1

哎呀!這是一個神祕的句子。在http://bugs.mysql.com處提交「文檔」錯誤。 「內存量」是一個糟糕的選擇。

這是一些更多的信息;希望我能更好地解釋它。

InnoDB表主要由「數據」和「索引」(以及一些元信息和可用空間)組成。數據信息PRIMARY KEY都在B樹,並給予,確切地說,在Data_length該樹的電流的大小。它是塊大小的確切倍數,默認爲16KB。所以,你可以做的最小的InnoDB表格仍然會說Data_length=16384

PRIMARY KEY(總是在InnoDB中)與數據「聚集」。數據由PK訂購。

其他索引被稱爲「輔助索引;他們居住在單獨的B樹(一個或多個),其總長度是Index_length

的‘緩衝池’,大小innodb_buffer_pool_size的,是RAM,其中數據的部分和索引被緩存用於通過InnoDB引擎有效地使用,直到該表被打開時,其任何塊是在RAM中。該發動機從不刻意加載整個表(或整個二級索引等)到RAM中。

一個相關的混亂...... RowsAvg_row_length是近似的,一個估計,那麼另一個從Data_length除以它來計算。