次の 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
インデックスには最初のレベルに 2 つの一意のエントリが必要であり、 「サブインデックス」with
に 3 つの一意のエントリ (編集: 4) が必要です。what
しかし、MySQL はレベルごとに 4 つの一意のエントリを報告します。log
つまり、各レベルの一意の要素の数は、テーブルの行数と常に等しくなります。
編集:「第 2 レベル」では一意のエントリの数がレコードの総数と同じであっても問題ありませんが、トップ レベルでは問題ありません。
EDIT2:with
列が占めるビットの数が int(11) に変更され、int(10) に戻るなど、カーディナリティが期待どおりに機能し始めることに気付きました。の適切な値もEXPLAIN SELECT COUNT(DISTINCT 'with') FROM log
表示しますrows
。
それはバグですか、機能ですか、それとも私の誤解ですか?