MySQL, где условие для индекса замедляет запрос?

#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 , которое использует все разделы, которые, как я думал, должны быть медленнее

no 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 — Я обсуждал этот вопрос в других вариантах, которые вы опубликовали.