有没有办法看到索引mysql的内容?

时间:2015-03-15 04:28:28

标签: mysql indexing

我有一张表:

| employee | CREATE TABLE `employee` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `version` bigint(20) NOT NULL,
  `age` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `age_idx` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=latin1 |

这里我创建了一个名为“age_idx”的索引,我在这个表中有10000条记录,有什么方法可以看到索引如何存储记录的指针?

2 个答案:

答案 0 :(得分:1)

SHOW INDEX FROM employee;

然后对基数进行了大量阅读(对于你的第一个索引值,基数越高越好,等等)。

您无法看到索引的实际内容或内容分布。

答案 1 :(得分:0)

您在ENGINE中的表= InnoDB。你有两把钥匙。

PRIMARY KEY(id)是"群集"与B +树中的数据。也就是说,所有数据按id顺序排列。 (参见BTree的维基百科条目。)

每个"二级密钥" (例如你的KEY age_idxage))是以这种方式构建的。

  1. 继续使用其他PRIMARY KEY列。现在是(age, id)
  2. 仅使用这些列构建B +树。
  3. 后果:

    • 只需要ageid的任何查询都可以在二级索引中完全处理。这是一个覆盖索引" EXPLAIN提供了这个线索:Using index
    • 要按年龄查找某些内容(而不是'覆盖'),首先在二级索引中进行BTree查找和扫描,然后在PRIMARY KEY中按id重复查找/ Data BTree。
    • A"范围"通过PRIMARY KEY扫描(id似乎不太可能)非常有效,因为它只是访问B +树中的连续条目。

    B +树的重要特征:

    • 找到一个项目非常有效。为O(log(n))的
    • 非常有效地扫描 - 下一个'和' prev' item在树中基本相邻。
    • 经验法则:扇出为100; "块"中有100个项目。 (这可以从1到1000之间变化; 100通常是#34;足够接近"。)InnoDB块是16KB。

    您的特定字段过大:

    • id BIGINT SIGNED需要8个字节。 MEDIUMINT UNSIGNED(3个字节,范围016万)可能是"员工"的更好选择。
    • age INT SIGNED占用4个字节,允许负年龄和年龄超过4 bilion。 TINYINT UNSIGNED(1字节和0..255)对于今天生活的人来说已经足够了。

    任何InnoDB BTree都有很多开销;因此,当估计索引(或数据)将占用多少磁盘空间时,上面的字节数可能会低2倍。