3

考虑以下 MySQL 表:

CREATE TABLE `log`
(
    `what` enum('add', 'edit', 'remove') CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
    `with` int(10) unsigned NOT NULL,

    KEY `with_what` (`with`,`what`)
) ENGINE=InnoDB;

INSERT INTO `log` (`what`, `with`) VALUES
    ('add', 1),
    ('edit', 1),
    ('add', 2),
    ('remove', 2);

据我了解,with_what索引的第一with级必须有 2 个唯一条目,“子索引”中必须有 3 个(编辑:4)唯一条目what。但是 MySQL 为每个级别报告 4 个唯一条目。换句话说,每个级别的唯一元素数始终等于log表中的行数。

编辑:“第二级”的唯一条目数等于记录总数是可以的,但对于顶级则不行。

EDIT2:已经注意到如果列占用的位数with发生变化,例如到 int(11) 并返回到 int(10),那么基数开始按预期工作。甚至EXPLAIN SELECT COUNT(DISTINCT 'with') FROM log显示足够的价值rows

这是一个错误,一个功能还是我的误解?

4

3 回答 3

1

SHOW INDEXES显示近似的统计数据。

这些统计信息会在执行对表的查询时自动收集,此外,您可以通过发出ANALYZE TABLE log.

基数列中的值不准确ANALYZE,即使基础表未更改,它也可以在对 的调用之间更改。

于 2010-12-25T14:18:51.753 回答
0

你的理解是错误的。多列键是从多个值创建的,而不是针对多列。MySQL 报告 4 个唯一条目,因为您输入了 4 个唯一条目对。

您已经为这些列描述了单独的索引,因此

KEY `with_what` (`with`,`what`)

它应该是

KEY `with` (`with`),
KEY `what` (`what`)

它应该按照您的意愿工作。

于 2010-12-25T08:54:32.320 回答
0

您应该将“多列”索引视为“连接索引”,这意味着各个列在索引中连接。也就是说,每一行都有一个索引条目,并且该条目包含所有索引列。

查看我的电子书以全面了解索引的工作原理:http: //Use-The-Index-Luke.com/

于 2010-12-26T08:52:23.313 回答