[英]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.