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インデックスには最初のレベルに 2 つの一意のエントリが必要であり、 「サブインデックス」withに 3 つの一意のエントリ (編集: 4) が必要です。whatしかし、MySQL はレベルごとに 4 つの一意のエントリを報告します。logつまり、各レベルの一意の要素の数は、テーブルの行数と常に等しくなります。

編集:「第 2 レベル」では一意のエントリの数がレコードの総数と同じであっても問題ありませんが、トップ レベルでは問題ありません。

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

あなたの理解は間違っています。複数列キーは、複数の列ではなく、複数の値から作成されます。エントリの 4 つの一意のペアを入力したため、MySQL は 4 つの一意のエントリを報告します。

これらの列に個別のインデックスを記述したので、代わりに

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

そのはず

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

そして、あなたが望むように動作するはずです。

于 2010-12-25T08:54:32.320 に答える
0

「複数列」インデックスは「連結インデックス」と考える必要があります。つまり、個々の列がインデックス内で連結されます。つまり、各行に 1 つのインデックス エントリがあり、そのエントリにはインデックス付きのすべての列が含まれます。

インデックスがどのように機能するか全体像を把握するには、私の電子ブックをご覧ください: http://Use-The-Index-Luke.com/

于 2010-12-26T08:52:23.313 に答える