Почему многостолбцовый индекс MySQL перенаселен? - PullRequest
3 голосов
/ 25 декабря 2010

Рассмотрим следующую таблицу 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.

РЕДАКТИРОВАТЬ: «Второй уровень» может иметь количество уникальных записей, равное общему количеству записей, но не подходит для верхнего уровня.

EDIT2: Заметили, что если число битов, занятых столбцом with, изменилось, например, на int (11) и обратно на int (10), то кардинальность начнет работать как положено. Даже EXPLAIN SELECT COUNT(DISTINCT 'with') FROM log отображает адекватное значение для rows.

Это ошибка, особенность или мое недоразумение?

Ответы [ 3 ]

1 голос
/ 25 декабря 2010

SHOW INDEXES показывает приблизительную статистику.

Эта статистика собирается автоматически при выполнении запросов к таблице, и, кроме того, вы можете принудительно собирать их вручную, введя ANALYZE TABLE log.

Значение в столбце количества элементов не является точным, и оно может изменяться между вызовами на ANALYZE, даже если базовая таблица не изменяется.

0 голосов
/ 26 декабря 2010

вы должны думать о «многостолбцовом» индексе как о «сцепленном индексе», то есть отдельные столбцы объединяются в индексе. То есть для каждой строки существует одна запись индекса, и эта запись содержит все проиндексированные столбцы.

Взгляните на мою электронную книгу, чтобы получить полную картину работы индексов: http://Use -The-Index-Luke.com /

0 голосов
/ 25 декабря 2010

Ваше понимание неверно. Ключ нескольких столбцов создается из нескольких значений, а не для нескольких столбцов. MySQL сообщает о 4 уникальных записях, потому что вы ввели 4 уникальные пары записей.

Вы описали отдельные индексы для этих столбцов, поэтому вместо

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

должно быть

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

И это должно работать так, как вы хотели.

...