При попытке выполнить запрос, указав неиндексированный столбец или *, индекс не используется. Использование индексированного столбца или счетчика (*) использует индекс. Любая идея, почему указание любого неиндексированного столбца в выходных данных приведет к тому, что индекс не будет использоваться? Я заметил, что с увеличением количества строк мои запросы замедляются.
Вот три идентичных запроса, в которых один использует 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;