Это быстро:
select ba.name,
penamt.value penamt,
#address_line4.value address_line4
from account a
join customer c on a.customer_id = c.id
join branch br on a.branch_id = br.id
join bank ba on br.bank_id = ba.id
join account_address aa on aa.account_id = a.id
join address ad on aa.address_id = ad.id
join state s on ad.state_id = s.id
join import i on a.import_id = i.id
join import_bundle ib on i.import_bundle_id = ib.id
join (select * from unused where heading_label = 'PENAMT') penamt ON penamt.account_id = a.id
#join (select * from unused where heading_label = 'Address Line 4') address_line4 ON address_line4.account_id = a.id
where i.active=1
И это быстро:
select ba.name,
#penamt.value penamt,
address_line4.value address_line4
from account a
join customer c on a.customer_id = c.id
join branch br on a.branch_id = br.id
join bank ba on br.bank_id = ba.id
join account_address aa on aa.account_id = a.id
join address ad on aa.address_id = ad.id
join state s on ad.state_id = s.id
join import i on a.import_id = i.id
join import_bundle ib on i.import_bundle_id = ib.id
#join (select * from unused where heading_label = 'PENAMT') penamt ON penamt.account_id = a.id
join (select * from unused where heading_label = 'Address Line 4') address_line4 ON address_line4.account_id = a.id
where i.active=1
Но это медленно:
select ba.name,
penamt.value penamt,
address_line4.value address_line4
from account a
join customer c on a.customer_id = c.id
join branch br on a.branch_id = br.id
join bank ba on br.bank_id = ba.id
join account_address aa on aa.account_id = a.id
join address ad on aa.address_id = ad.id
join state s on ad.state_id = s.id
join import i on a.import_id = i.id
join import_bundle ib on i.import_bundle_id = ib.id
join (select * from unused where heading_label = 'PENAMT') penamt ON penamt.account_id = a.id
join (select * from unused where heading_label = 'Address Line 4') address_line4 ON address_line4.account_id = a.id
where i.active=1
Почему это быстро, когда явключить только один из двух подзапросов, но медленно, когда я включаю оба?Я бы подумал, что это должно быть в два раза медленнее, когда я включаю оба, но это занимает очень много времени.Вкл на MySQL.
Вот EXPLAIN
:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 19584
1 PRIMARY a eq_ref PRIMARY,fk_account_branch_id,fk_account_customer_id,fk_account_import_id PRIMARY 8 penamt.account_id 1
1 PRIMARY br eq_ref PRIMARY,fk_branch_bank_id PRIMARY 8 mcif.a.branch_id 1
1 PRIMARY i eq_ref PRIMARY,import_bundle_id PRIMARY 8 mcif.a.import_id 1 "Using where"
1 PRIMARY ba eq_ref PRIMARY PRIMARY 8 mcif.br.bank_id 1
1 PRIMARY c eq_ref PRIMARY PRIMARY 8 mcif.a.customer_id 1 "Using index"
1 PRIMARY ib eq_ref PRIMARY PRIMARY 8 mcif.i.import_bundle_id 1 "Using index"
1 PRIMARY aa ref fk_account_address_account_id,fk_account_address_address_id fk_account_address_account_id 8 mcif.a.id 1 "Using where"
1 PRIMARY <derived3> ALL NULL NULL NULL NULL 368367 "Using where; Using join buffer"
1 PRIMARY ad eq_ref PRIMARY,fk_account_state_id PRIMARY 8 mcif.aa.address_id 1
1 PRIMARY s eq_ref PRIMARY PRIMARY 8 mcif.ad.state_id 1 "Using index"
3 DERIVED unused ref heading_label heading_label 257 469722 "Using where"
2 DERIVED unused ref heading_label heading_label 257 15632 "Using where"