MySQL Не использовать индекс при указании неиндексированных столбцов - PullRequest
0 голосов
/ 28 марта 2020

При попытке выполнить запрос, указав неиндексированный столбец или *, индекс не используется. Использование индексированного столбца или счетчика (*) использует индекс. Любая идея, почему указание любого неиндексированного столбца в выходных данных приведет к тому, что индекс не будет использоваться? Я заметил, что с увеличением количества строк мои запросы замедляются.

Вот три идентичных запроса, в которых один использует count (*), другой просто использует *, а другой использует индексированный столбец.

Оптимизированный запрос

MariaDB [db]> explain select count(*) from data_history where id=18 and time > date_sub(now(), interval 7 day)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: data_history
         type: index
possible_keys: PRIMARY,ID
          key: ID
      key_len: 26
          ref: NULL
         rows: 1176921
        Extra: Using where; Using index
1 row in set (0.00 sec)

Неоптимизированный запрос

MariaDB [db]> explain select * from data_history where id=18 and time > date_sub(now(), interval 7 day)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: data_history
         type: ALL
possible_keys: PRIMARY,ID
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1176929
        Extra: Using where
1 row in set (0.00 sec)

Оптимизированный запрос

MariaDB [db]> explain select id from data_history where id=18 and time > date_sub(now(), interval 7 day)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: data_history
         type: index
possible_keys: PRIMARY,ID
          key: ID
      key_len: 26
          ref: NULL
         rows: 1176935
        Extra: Using where; Using index
1 row in set (0.00 sec)

Структура таблицы

CREATE TABLE `data_history` (
  `id` varchar(20) NOT NULL DEFAULT '',
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `b1` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`,`time`),
  UNIQUE KEY `ID` (`id`,`time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

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