InnoDB - > Int vs VarChar的键数

时间:2017-02-02 01:30:11

标签: mysql indexing innodb

我正在通过各种论坛阅读和堆叠流程问题,但找不到我的答案。

我正在尝试找出将存储在16KB InnoDb数据库页面中的密钥数量。

正如您在this forum中所看到的,他们提到了如何在单个页面中计算MyISAM的密钥数量。我想对InnoDb做同样的事情。我不明白这些计算是如何进行的。

我比较一个4KB的int和一个VARCHAR(200)。如果我能得到这个计算会很棒。

1 个答案:

答案 0 :(得分:0)

  • 索引的结构为BTree。
  • InnoDB BTrees最初只填充了15/16。
  • 经过大量的流失后,BTree的平均成绩为69%。
  • 每行排除了大量的开销。在索引条目中。
  • PRIMARY KEY(在InnoDB中)是"群集"与数据。因此,只有非叶节点才会占用额外的块。
  • 二级索引包含PRIMARY KEY的所有列;这就是他们如何指出'记录。
  • 根据以上两项,在BTree中只有一个INT没有意义。

我使用简单的经验法则:100'行'每个BTree。
推论:百万行BTree深度约为3级;十亿行的表约为5级。

让我们来看看:

CREATE TABLE x (
    id INT ...,
    num INT ...,
    str VARCHAR(200) CHARACTER SET utf8,
    PRIMARY KEY (id),
    INDEX i_num (num),
    INDEX i_str (str)
) ENGINE=InnoDB;

对于i_num,请注意有两个INTs。您可能会获得300-400行#39;每块。 1000万行需要3个级别。

对于i_str,让我们假定平均有100个韩文字符 - 这是文本的300字节。你可能会得到25-35行'每块。 10M行将需要5个级别。

ALTEROPTIMIZE可能或者可能不会对索引进行碎片整理。

information_schema个表格提供有关每个BTree及其级别的部分详细信息。 Percona和MySQL有不同的表格。

底线:计算过于模糊而不准确。我希望我挥手让你有更好的手柄。