@kirill-93

Как улучшить запрос?

explain 
select `bq_posts`.* 
from `bq_posts` 
where  `bq_posts`.`entity_id` in (1, 2, 3, 4, 5)
and `bq_posts`.`post_type` in ('facebook', 'twitter', 'youtube', 'vevo', 'itunes', 'amazon', 'soundcloud', 'bit', 'ticketfly', 'festival', 'event', 'media') 
order by `bq_posts`.`created_at` desc 
limit 10 offset 0;

Второй день мучаюсь, помогите пожалуйста. У меня для этой таблицы есть индекс entity_id,post_type, есть наоборот post_type,entity_id. Но explain показывает что используется индекс posts_entity_id_amazon_asin_unique, keylen = 4, то есть используется только индекс для entity_id. Почему mysql так себя ведет? Если насильно установить индекс, который я хочу, запрос не ускоряется. В чем тут дело? entity_id = int(10), post_type = enum.
UPD: если в post_type in () оставить только одно значение, например только 'facebook', то все становится хорошо. То же самое, если в entity_id оставить только одно число.
Помогите, пожалуйста!

UPD2:
Explain:
mysql> explain 
    -> select `bq_posts`.* 
    -> from `bq_posts` 
    -> where  `bq_posts`.`entity_id` in (1, 2, 3, 4, 5)
    -> and `bq_posts`.`post_type` in ('facebook', 'twitter', 'youtube', 'vevo', 'itunes', 'amazon', 'soundcloud', 'bit', 'ticketfly', 'festival', 'event', 'media') 
    -> order by `bq_posts`.`created_at` desc 
    -> limit 10 offset 0 \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: bq_posts
   partitions: NULL
         type: range
possible_keys: posts_entity_id_amazon_asin_unique,posts_entity_id_festival_id_unique,posts_entity_id_post_type_is_duplicate_deleted_index,full_index,entity_id_created_at_post_type_is_duplicate
          key: posts_entity_id_amazon_asin_unique
      key_len: 4
          ref: NULL
         rows: 496
     filtered: 50.00
        Extra: Using index condition; Using where; Using filesort
1 row in set, 1 warning (0.00 sec)
  • Вопрос задан
  • 140 просмотров
Пригласить эксперта
Ответы на вопрос 4
@BorisKorobkov Куратор тега MySQL
Web developer
Сравнение entity_id с 5 значениями, post_type - с 12-ю. Итого 60 сравнений на каждую запись! Оптимизатор в реальности сделает меньше сравнений, но все равно это очень неэффективно.
Надо детально разбираться в нюансах и менять бизнес-логику.
Ответ написан
qonand
@qonand
Software Engineer
просто разберитесь как устроены индексы в MySQL и все станет на свои места, вот например статья о устройстве индексов
Ответ написан
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Для начала выкиньте MySQL на помойку.
Если это единственный тип запроса на таблицу сделайте составной индекс.
И кроме того надо смотреть explain
Ответ написан
@ynblpb_spb
дятел php
FORCE INDEX (`index_name`)
попробуйте добавить в запрос
https://dev.mysql.com/doc/refman/5.7/en/index-hint...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы