0

假设我有三列,A、B、C。它们分别具有x、y 和 z 可能值的范围。

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

4

1 回答 1

0

不。一个的大小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% 的额外开销。

于 2021-01-21T17:59:40.363 回答