簡體   English   中英

MySQL/MariaDB 中復合索引的大小是多少

[英]What is the size of a composite index in MySQL/MariaDB

假設我有三列,A、B、C。 它們分別具有一個范圍的x、y 和 z可能值

所有三列上的索引是否具有與 x * y * z 成比例的大小?

不, INDEX的大小是(大致)

  N * L + overhead

N = 整個表中的行數。
L = 索引所有列中的值的長度(以字節為單位),加上PRIMARY KEY中的列。
開銷 = 各種指針、長度、填充等

示例: CREATE TABLE... id INT PRIMARY KEY, A INT, INDEX(A)...

INT是一個 4 字節的數據類型。 它可以保存超過 40 億個不同的值。 如果表中有 100 行,讓我們看看保存輔助INDEX(A)的 BTree。

N = 100
L = 4 + 4  -- that bytes, not billions of bytes

N * L = 800,但是一旦增加了開銷,並且使用了阻塞,它將占用 16KB。 (注意:InnoDB 以 16KB 的“塊”分配數據和索引。)

現在添加到該表

city VARCHAR(100),  -- average length 10 characters
INDEX(city, A)

N = 100  -- still assuming 100 rows
L = (2+10) + 4 + 4 = 16
total = again, only 1-2 blocks.

(2+10) : 2 表示字符串的“長度”; 實際字符串平均為 10 個。 (在某些情況下,“2”實際上是“1”,如果您使用的是 utf8,每個字符可能是多個字節。)

如果該表增長到 100 萬行,則索引可能需要 50MB,其中很多是不可避免的“開銷”。

一個主要的例外:

對於 InnoDB, PRIMARY KEY的大小幾乎為零,因為它與數據“聚集”在一起。 實際上,該 BTree 中的非葉節點和一些“開銷”大約有 1% 的額外開銷。

暫無
暫無

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

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