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 = 整个table中的行数。
L = 索引所有列中值的长度(以字节为单位),加上 PRIMARY KEY
.
中的列
开销 = 各种指针、长度、填充等
示例:CREATE TABLE ... id INT PRIMARY KEY, A INT, INDEX(A) ...
INT
是一个 4 字节的数据类型。它可以容纳超过 40 亿个不同的值。如果 table 中有 100 行,让我们看一下持有辅助 INDEX(A)
.
的 BTree
N = 100
L = 4 + 4 -- that bytes, not billions of bytes
N * L = 800,但是一旦加上开销,再使用blocking,就需要16KB。 (注意:InnoDB 以 16KB 的“块”分配数据和索引。)
现在添加 table
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,每个 character 可能是多个 bytes。)
如果 table 增长到 100 万行,索引可能需要 50MB,其中很多是不可避免的“开销”。
主要例外:
对于 InnoDB,PRIMARY KEY
的大小几乎为零,因为它与数据“成簇”。实际上,该 BTree 中的非叶节点和一些 'overhead'.
有大约 1% 的额外
假设我有三列,A、B、C。它们每个都有一个范围 x、y 和 z 可能的值分别
所有三列上的索引的大小是否都与 x * y * z 成正比?
没有。 INDEX
的大小是(大约)
N * L + overhead
N = 整个table中的行数。
L = 索引所有列中值的长度(以字节为单位),加上 PRIMARY KEY
.
中的列
开销 = 各种指针、长度、填充等
示例:CREATE TABLE ... id INT PRIMARY KEY, A INT, INDEX(A) ...
INT
是一个 4 字节的数据类型。它可以容纳超过 40 亿个不同的值。如果 table 中有 100 行,让我们看一下持有辅助 INDEX(A)
.
N = 100
L = 4 + 4 -- that bytes, not billions of bytes
N * L = 800,但是一旦加上开销,再使用blocking,就需要16KB。 (注意:InnoDB 以 16KB 的“块”分配数据和索引。)
现在添加 table
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,每个 character 可能是多个 bytes。)
如果 table 增长到 100 万行,索引可能需要 50MB,其中很多是不可避免的“开销”。
主要例外:
对于 InnoDB,PRIMARY KEY
的大小几乎为零,因为它与数据“成簇”。实际上,该 BTree 中的非叶节点和一些 'overhead'.