Имеется 3 таблицы
1. Компании wmail_company
2. Заявки wmail_order
3. Счета wmail_comm_bill
Счета связаны с компаниями через заявку (wmail_comm_bill.order_id = wmail_order.id AND wmail_order.company_id = wmail_company.id)
Необходимо выявить 50 компаний у кого больше всего счетов, выполняем запрос:
SELECT wmail_company.id, wmail_company.caption,
(SELECT COUNT(*) FROM wmail_comm_bill, wmail_order WHERE wmail_comm_bill.order_id = wmail_order.id AND wmail_order.company_id = wmail_company.id) AS billcount
FROM wmail_company GROUP BY wmail_company.id ORDER BY billcount DESC LIMIT 0, 50
Он выполняется за 58.211 s - очень долго
EXPLAIN такого вида:
id? select_type? table? partitions? type? possible_keys? key? key_len? ref? rows? Extra?
1 PRIMARY wmail_company NULL ALL NULL NULL NULL NULL 6186 Using filesort
2 DEPENDENT SUBQUERY wmail_comm_bill NULL index order_id order_id 4 NULL 2158 Using index
2 DEPENDENT SUBQUERY wmail_order NULL eq_ref PRIMARY,company_id PRIMARY 4 wmail.wmail_comm_bill.order_id 1 Using where
дополнительные ключи расставлены по wmail_comm_bill.order_id, wmail_order.company_id
основные ключи id есть во всех таблицах