Почему у моего составного индекса MySQL меньше кардинальности, чем у одного индекса в том же столбце? - PullRequest
1 голос
/ 11 апреля 2019

Сначала я создал 2 отдельных индекса в своей таблице: uid и time. Тогда я решил создать составной индекс (UID, время). Но почему количество элементов uid в составном индексе (строка 3) меньше количества элементов uid в одном индексе (строка 1)?

mysql> show index from full_data;
+-----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| full_data |          1 | uid       |            1 | uid         | A         |    26394792 |     NULL | NULL   | YES  | BTREE      |         |               |
| full_data |          1 | time      |            1 | time        | A         |     6934463 |     NULL | NULL   | YES  | BTREE      |         |               |
| full_data |          1 | composite |            1 | uid         | A         |    23166632 |     NULL | NULL   | YES  | BTREE      |         |               |
| full_data |          1 | composite |            2 | time        | A         |    86380688 |     NULL | NULL   | YES  | BTREE      |         |               |
+-----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.05 sec)

1 Ответ

0 голосов
/ 23 апреля 2019

Количество элементов, в этом контексте , является приблизительной оценкой, основанной на нескольких случайных исследованиях индекса BTree.INDEX(uid) выполняет один набор случайных проб;INDEX(uid, time) проверяет другое BTree.

Когда у вас есть и INDEX(uid), и INDEX(uid, time), вам практически не нужно сохранять первое.Он загромождает диск, добавляет время вставки / обновления / удаления и не заметно ускоряет SELECT.Иногда он может даже замедляться SELECT.

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

...