#mysql
#mysql
Вопрос:
Привет, я написал запрос MySQL, который показан ниже.
SELECT device_uuid,
day_epoch,
hour,
zone_id,
is_repeat,
(day_epoch (3600*hour)) AS hour_epoch
FROM tracking_daily_stats_zone_unique_device_uuids_per_hour
WHERE day_epoch >= 1552435200
AND day_epoch < 1553040000
AND venue_id = 46
AND zone_id IN (102,105,108,110,111,113,116,117,118,121,287)
Я столкнулся со странной проблемой, которая запутала мое понимание MySQL. Когда я запускаю приведенный выше запрос, который использует venue_id
(индекс), время выполнения занимает около 30 секунд.
Когда я удаляю venue_id
условие и оставляю все остальное неизменным, время выполнения сокращается до 9 секунд.
Вот объяснение при использовании venue_id
как вы можете видеть, он смотрит на один раздел, который, я считаю, должен быть быстрее.
Вот объяснение, которое не использует venue_id
, которое использует все разделы, которые, как я думал, должны быть медленнее
«На приведенном выше изображении показаны не все разделы, потому что, если бы я показал их все, я не смог бы сделать скриншот «.
На приведенном выше изображении показаны не все разделы, потому что, если бы я показал их все, я не смог бы сделать скриншот.Как вы, вероятно, уже выяснили, данные таблицы разбиты на разделы venue_id
, и причиной этого было ускорение запросов.
Вот скриншот индексов для этой таблицы:
Комментарии:
1. Индекс с низкой мощностью (9) отчасти бесполезен.
2. Извините, я не гуру MySQL, я просто знаю, как писать полу-приличные запросы, так что это может быть глупый вопрос. Было бы лучше удалить
venue_id
индекс, чтобы вместо этого он использовалvenue_id
в PK?3. Хорошо, это зависит от «избирательности» каждого условия фильтрации. Теперь у вас есть три условия фильтрации: по day_epoch, по venue_id и по zone_id. Можете ли вы определить, какой процент строк извлекается каждой отдельной из общего количества строк?
4. Всего имеется 260938780 строк, фильтр day_epoch = 4266946, фильтр venue_id = 11654015 и фильтр zone_id = 11103307. Я надеюсь, что это помогает
5. @Lukerayner — Я обсуждал этот вопрос в других вариантах, которые вы опубликовали.