mysql уникальный индекс в столбце char не используется с предложением IN - PullRequest
1 голос
/ 06 мая 2020

Mysql версия - 5.7.22

Определение таблицы

CREATE TABLE `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` char(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `title` varchar(254) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created` datetime(6) NOT NULL,
  `modified` datetime(6) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `book_uuid` (`uuid`),
  ) ENGINE=InnoDB AUTO_INCREMENT=115 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Запрос

SELECT DISTINCT `books`.`id`,
                `books`.`uuid`,
                `books`.`title`
FROM `books`
WHERE (`books`.`uuid` IN ("334222a0e99b4a3e97f577665055208e",
                            "979c059840964934816280ba85c67221",
                            "4e2978c765dd435998666ea3083666e5",
                            "535aa78ba80e4215bbf75fb1e20cc5f3",
                            "f969fb10c72b4875aabdf75c1b493524",
                            "1daa0015055444a4b1c0821618a7a4d9",
                            "04f34ede284a4b86b0adddb405d30a75",
                            "513cad12c88c44c6ab248d43643459b9",
                            "de2bde6d016f4381ad0ba714234386fa",
                            "f645c2c9f1594a199a960b97b7015986",
                            "3ce02c072f24447a8a7b269a19ec554f",
                            "75450daf9d024d9d9c0df038437ae2c2",
                            "0e822042b50b4f79bb38304e0acde6f0",
                            "38d808fb3f9a4f57b4f7b30a141e7169",
                            "ecd424abd3a94a339383f6f8e668655e"))
ORDER BY `books`.`id` DESC
LIMIT 15;

когда я объясняю этот запрос, он не выбирает индекс

+----+-------------+-----------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+
| id | select_type | table           | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                       |
+----+-------------+-----------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+
|  1 | SIMPLE      | books           | NULL       | ALL  | book_uuid     | NULL | NULL    | NULL |  107 |    12.15 | Using where; Using filesort |
+----+-------------+-----------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+

как ни странно, индекс правильно используется, когда в предложение IN передано 12 или менее записей (без принудительного индекса)

принудительный индекс работает, но я не могу принудительно индексировать поскольку этот запрос создан django ORM, нельзя использовать django - mysql s force_index , как я на Innodb

Примечание : Я знаю, что в этом запросе можно избежать "отличных" и "предельных значений", но это часть более крупного запроса, поэтому я оставил их как есть

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