Почему мои похожие запросы обрабатываются по-разному? - PullRequest
0 голосов
/ 21 сентября 2018

У нас есть таблица

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, но ключ отличается значительно.

1 Ответ

0 голосов
/ 01 октября 2018

У вас ошибка .T в постоянной времени не распознается MySQL;измените его на пробел.

Вы должны переключиться на InnoDB .

В MyISAM это ускорит запрос:

INDEX(channel_id, station_id,  -- in either order
      time,
      reading)   -- last

Это было бы "охватом", следовательно, быстрее, чем граница между индексом и данными.

Назад к почему они разные ... Я нея знаюОднако любой из этих может помочь с таблицей MyISAM: ANALYZE TABLE или OPTIMIZE TABLE.

...