Mysql Indexing не работает на определенной таблице - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть большой набор данных в версии MySQL 5.6 И предположим, что имя столбца A, столбца B и столбца C.

columnA (bigint) columnB (bigint) Время (метка времени)

ГдеЯ применил BTREE UNIQUE INDEXING.

Но когда я объясняю свой запрос, я просматриваю все строки.

Я пытался проанализировать, восстановить таблицу, но безуспешно.

Примечание:

В разных таблицах после применения к индексу я получаю ожидаемый результат.

Размер столбца A (bigint 20), в котором возникла проблема, превышает 50 000.

Я хочу, чтобы после индексации прошла одна строка.

При хранении базы данных Mysql в индексе отображается 0B.

CREATE TABLE TableA ( ColumnA bigint(20) NOT NULL DEFAULT '0', 
                      ColumnB bigint(20) NOT NULL DEFAULT '0', 
                      ColumnC bigint(20) NOT NULL DEFAULT '0', 
                      ColumnD bigint(20) NOT NULL DEFAULT '0', 
                      ColumnE timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `TableA`
  ADD UNIQUE KEY `idx_npp_pid` (`ColumnA`),
  ADD KEY `idx_npp_uid` (`ColumnD`);
COMMIT;

EXPLAIN SELECT `ColumnA` FROM `TableA` WHERE `ColumnA`=4444;

Объяснение результата:

id select_type    table    type    possible_keys   key    key_len    ref   rows   Extra 
1  SIMPLE         TableA   ALL     NULL            NULL   NULL       NULL  132244     Using where

1 Ответ

1 голос
/ 25 сентября 2019

При хранении базы данных Mysql в индексе отображается 0B.

InnoDB всегда нуждается в первичном ключе, поскольку он кластеризует первичный ключ с данными (и поэтому он также называется кластеризованным индексом).).Вот почему нет явного дискового хранилища для индекса, когда в таблице InnoDB определен только первичный ключ.

Теперь, если вы не определите первичный ключ явно, InnoDB ищет первый уникальныйКлюч, который также не равен NULL, неявно определяется как первичный ключ.Если такого ключа нет, он создает скрытый первичный ключ.Таким образом, всегда лучше определить первичный ключ.В вашем случае он неявно рассматривал ColumnA как первичный ключ, потому что он УНИКАЛЬНЫЙ, а НЕ NULL.

Если нет естественного первичного ключа (комбинации), то люди обычно советуют определить суррогатный первичный ключ, используя auto_increment.

Получить более подробную информацию здесь: https://dev.mysql.com/doc/refman/5.6/en/innodb-index-types.html

Но когда я объясняю свой запрос, я прохожу все строки.

Вы должны предоставить нам свой EXPLAIN.. результат плана, чтобы иметь возможность прийти к какому-либо заключению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...