假设我有三列,A、B、C。它们分别具有x、y 和 z 可能值的范围。
所有三列上的索引是否具有与 x * y * z 成比例的大小?
假设我有三列,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 行,让我们看一下持有 secondary 的 BTree INDEX(A)
。
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% 的额外开销。