Почему индекс с несколькими колоннами MySQL перенаселен?

StackOverflow https://stackoverflow.com/questions/4529746

Вопрос

Подумайте о том, чтобы следовать таблице 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: заметили, если количество битов, занятых with Столбец изменился, например, на INT (11) и обратно в INT (10), затем кардинальность начинает работать, как и ожидалось. Даже EXPLAIN SELECT COUNT(DISTINCT 'with') FROM log отображать адекватное значение для rows.

Это ошибка, функция или мое недоразумение?

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

так должно быть

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

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

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

Посмотрите на мою электронную книгу, чтобы получить полную картину, как работают индексы: http://use-the-index-luke.com/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top