我有一张表:
| 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条记录,有什么方法可以看到索引如何存储记录的指针?
答案 0 :(得分:1)
SHOW INDEX FROM employee;
然后对基数进行了大量阅读(对于你的第一个索引值,基数越高越好,等等)。
您无法看到索引的实际内容或内容分布。
答案 1 :(得分:0)
您在ENGINE中的表= InnoDB。你有两把钥匙。
PRIMARY KEY(id)
是"群集"与B +树中的数据。也就是说,所有数据按id
顺序排列。 (参见BTree的维基百科条目。)
每个"二级密钥" (例如你的KEY age_idx
(age
))是以这种方式构建的。
(age, id)
。后果:
age
和id
的任何查询都可以在二级索引中完全处理。这是一个覆盖索引" EXPLAIN提供了这个线索:Using index
。id
重复查找/ Data BTree。id
似乎不太可能)非常有效,因为它只是访问B +树中的连续条目。B +树的重要特征:
您的特定字段过大:
id
BIGINT SIGNED需要8个字节。 MEDIUMINT UNSIGNED(3个字节,范围016万)可能是"员工"的更好选择。age
INT SIGNED占用4个字节,允许负年龄和年龄超过4 bilion。 TINYINT UNSIGNED(1字节和0..255)对于今天生活的人来说已经足够了。任何InnoDB BTree都有很多开销;因此,当估计索引(或数据)将占用多少磁盘空间时,上面的字节数可能会低2倍。