Я унаследовал следующий запрос:
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