MySQL Optimizing Join - PullRequest
       16

MySQL Optimizing Join

0 голосов
/ 11 апреля 2019

Я унаследовал следующий запрос:

    select [...]
    from
        t_bike_use
            join t_bike
                 on t_bike_use.bid = t_bike.id
            join t_user
                 on t_bike_use.uid = t_user.id
            left join t_violation
                      on t_violation.useid = t_bike_use.id
            left join t_trade
                      on t_bike_use.id = t_trade.record_id
            left join t_admin
                      on t_bike_use.admin_id = t_admin.id
            join t_user_detail
                 on t_user.id = t_user_detail.uid
    group by t_bike_use.id
    order by t_violation.id desc

У меня проблемы с выполнением этого соединения быстро. В настоящее время это занимает 1.6s, и, поскольку он выполняется часто, он стремится поставить базу на колени.

Таблицы t_bike_use, t_bike, t_user и t_trade имеют от 2 до 8 тысяч строк. Однако между t_bike_use и t_bike и t_user существуют внешние ключи, но не один для t_trade.record_id.

Если я удаляю соединение с t_trade, время выполнения падает до 400 мс.

    left join t_trade
              on t_bike_use.id = t_trade.record_id

У меня есть индекс на t_trade.record_id, но MySQL 5.6 не хочет его использовать.

Как можно оптимизировать этот запрос?

Вот вывод EXPLAIN.

1  SIMPLE  t_bike_use     ALL     PRIMARY,uuid,fk_uid,fk_bid  <>       <>  <>                   1771  Using temporary; Using filesort
1  SIMPLE  t_violation    ALL     <>                          <>       <>  <>                   1     Using where; Using join buffer (Block Nested Loop)
1  SIMPLE  t_user         eq_ref  PRIMARY                     PRIMARY  4   t_bike_use.uid       1   
1  SIMPLE  t_bike         eq_ref  PRIMARY                     PRIMARY  4   t_bike_use.bid       1   
1  SIMPLE  t_user_detail  ref     fk_uid                      fk_uid   4   t_bike_use.uid       1   
1  SIMPLE  t_trade        ALL     record_id                   <>       <>  <>                   2085  Range checked for each record (index map: 0x2)
1  SIMPLE  t_admin        eq_ref  PRIMARY                     PRIMARY  4   t_bike_use.admin_id  1   

1 Ответ

0 голосов
/ 11 апреля 2019

Вместо этого можно использовать подзапрос Join, который ускоряет выполнение запроса.

...