У нас есть таблица
mysql> show create tabledata \ G
*************************** 1. Строка ***************************
Таблица: channeldata
Создать таблицу: CREATE TABLE channeldata
(
channel_id
smallint (3) без знака NOT NULL,
station_id
smallint (5) без знака NOT NULL,
time
datetime NOT NULL,
reading
double NOT NULL ПО УМОЛЧАНИЮ'0',
average
double NOT NULL DEFAULT '0',
location_lat
double NOT NULL DEFAULT '0',
location_lon
double NOT NULL DEFAULT '0',
location_alt
double (8,3) DEFAULT '0,000',
quality
smallint (3) unsigned DEFAULT '0',
ПЕРВИЧНЫЙ КЛЮЧ (channel_id
, station_id
, time
),
КЛЮЧ composite3
(station_id
, channel_id
, quality
) ИСПОЛЬЗОВАНИЕ BTREE,
КЛЮЧ composite
(channel_id
, station_id
, time
, quality
) ИСПОЛЬЗОВАНИЕ BTREE) ДВИГАТЕЛЬ =CHISSET ПО УМОЛЧАНИЮ MyISAM = utf8 COLLATE = utf8_unicode_ci
1 строка в наборе (0,00 с)
Недавно я заметил, что некоторые из запросов на выборку, которые мы выполняем, выполняются довольно долго.Странно то, что в зависимости от значений столбца в предложении where выборка выполняется либо очень быстро, либо занимает много времени, блокируя обновления в той же таблице.Я выполнил эти запросы через объяснение:
mysql> объяснение ВЫБРАТЬ чтение из данных канала ГДЕ station_id = 6001
И channel_id = 1 И время <'2018-09-20T14: 58: 00' \ G<br> *************************** 1. ряд ***************************
id: 1 select_type: SIMPLE
таблица: channeldata
разделы: NULL
тип: ref
возможные_ключи: PRIMARY, композитный3, композитный
ключ: PRIMARY
key_len: 4
ref: const, const
строк: 176539
фильтруется: 33,33
Дополнительно: использование условия индекса 1 строка в наборе, 1 предупреждение (0,00 с)
mysql> объяснить SELECT для чтения из данных канала, ГДЕ station_id = 6001 И channel_id = 4 И время <'2018-09-20T14: 58: 00' \ G <br>*************************** 1. строка ***************************
id:1 select_type: SIMPLE
таблица: channeldata
разделы: NULL
тип: диапазон
возможные_ключи: PRIMARY, композитный3, композитный
ключ: PRIMARY
key_len: 9
ref: NULL
строки: 428073
отфильтровано: 100,00
Дополнительно: при использовании условия индекса 1 строка в наборе, 1 предупреждение (0,00 с)
Почему фильтрация для другого значения (channel_id равен 4 вместо 1) создаетразница?Оба набора результатов равны по размеру.Почему в обоих случаях MySQL выбирает использовать ключ PRIMARY, но ключ отличается значительно.