[InnoDB] Почему поле гендера не подходит для индексации?

MySQL

Структура таблицы и данные

id — первичный ключ, id — нечетный пол = 1, id — четный пол = 0 пол=0,50000 единиц данных, пол=1,50000 единиц данных

CREATE TABLE `people` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(1) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_initData`()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i<=100000 DO
        INSERT INTO people(name, sex) VALUES(CONCAT('姓名',i),0);
        SET i = i+1;
    END WHILE;
END

CALL proc_initData();
UPDATE people SET sex = 1 WHERE MOD(id,2) = 1;

Добавлен тип индекса

Результаты теста:

SELECT * FROM people WHERE sex = 0;
SELECT * FROM people WHERE sex = 1;
нет индекса пола с индексом пола
sex=0
在这里插入图片描述
在这里插入图片描述
sex=1
在这里插入图片描述
在这里插入图片描述

EXPLAIN после добавления индекса:

Вы можете видеть, что тот же sql намного медленнее после добавления индекса, чем без индекса.

причина

Каждая таблица в InnoDB будет иметь кластеризованный индекс.Если таблица определяет первичный ключ, первичным ключом является кластеризованный индекс. Таблица имеет только один кластеризованный индекс, а остальные — обычные индексы. Структура индекса представляет собой дерево B+, неконечные узлы хранят ключи, а конечные узлы хранят значения.

  1. В кластеризованном индексе конечные узлы хранят записи строк, а индексы и записи InnoDB хранятся вместе.
  2. Обычный индекс, конечный узел хранит значение первичного ключа.

Пример структуры индекса приведенной выше таблицы выглядит следующим образом (PS: структура индекса предназначена только для справки) кластеризованный индекс

Обычный индекс в столбце пола

При использовании запроса общего индекса сначала будет загружен общий индекс, а первичный ключ фактической строки будет запрошен через общий индекс. Затем используйте первичный ключ для запроса соответствующей строки через кластеризованный индекс. Этот цикл запрашивает все строки. Если вы выполняете прямой поиск по кластеризованному индексу полностью, вам не нужно переключаться между обычным индексом и кластеризованным индексом. Может оказаться более эффективным сканирование всей таблицы по сравнению с общими накладными расходами на две операции.

Ссылаться на:
Tickets.WeChat.QQ.com/Yes/TM KR AMC1M…
blog.jcole.us/innodb/
blog.CSDN.net/U012978884/…
D Raven ES есть.Что/MySQL-в кивок…