Запрос на обновление не полностью использует индекс в MySQL 8 - PullRequest
0 голосов
/ 01 июня 2018

Учитывая эту таблицу:

CREATE TABLE `queue` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` int(10) unsigned NOT NULL,
  `posted_on` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `status` enum('pending','complete','error') NOT NULL DEFAULT 'pending',
  `body` blob NOT NULL,
  `process_id` int(10) unsigned DEFAULT NULL,
  `acquired_on` datetime(6) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `acquiredon` (`acquired_on`),
  KEY `type_status_processid_postedon` (`type`,`status`,`process_id`,`posted_on`) USING BTREE
);

Когда я делаю выборку для этой таблицы, он полностью / правильно использует индекс:

EXPLAIN SELECT *
FROM `queue`
FORCE INDEX (`type_status_processid_postedon`)
WHERE type = 1
AND `status` = 'pending'
AND `process_id` IS NULL
ORDER BY `posted_on` ASC
LIMIT 1;

+----+-------------+-------+------------+------+--------------------------------+--------------------------------+---------+-------------------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys                  | key                            | key_len | ref               | rows | filtered | Extra                 |
+----+-------------+-------+------------+------+--------------------------------+--------------------------------+---------+-------------------+------+----------+-----------------------+
|  1 | SIMPLE      | queue | NULL       | ref  | type_status_processid_postedon | type_status_processid_postedon | 10      | const,const,const |    1 |   100.00 | Using index condition |
+----+-------------+-------+------------+------+--------------------------------+--------------------------------+---------+-------------------+------+----------+-----------------------+

И все же, когда я делаютот же запрос, что и UPDATE, индекс используется не полностью.

EXPLAIN UPDATE `queue`
FORCE INDEX(`type_status_processid_postedon`)
SET `process_id` = 1
WHERE `type` = 1
AND `status` = 'pending'
AND `process_id` IS NULL
ORDER BY `posted_on` ASC
LIMIT 1;

+----+-------------+-------+------------+-------+--------------------------------+--------------------------------+---------+-------------------+------+----------+-----------------------------+
| id | select_type | table | partitions | type  | possible_keys                  | key                            | key_len | ref               | rows | filtered | Extra                       |
+----+-------------+-------+------------+-------+--------------------------------+--------------------------------+---------+-------------------+------+----------+-----------------------------+
|  1 | UPDATE      | queue | NULL       | range | type_status_processid_postedon | type_status_processid_postedon | 10      | const,const,const |    1 |   100.00 | Using where; Using filesort |
+----+-------------+-------+------------+-------+--------------------------------+--------------------------------+---------+-------------------+------+----------+-----------------------------+

Обновление выполняет сортировку файлов.Что здесь происходит?

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