Ik heb een vreemd probleempje met MySQL wat vast logisch te verklaren is, maar ik kan het niet vinden...
ik heb 3 tabellen:
- statecodes
- invoices
- invoice_lines
de tabel statecodes bevat zo'n 12 statussen waarvan er 5 het vinkje "end_status" op false hebben staan.
de tabel invoices bevat zo'n 50.000 records
de tabel invoice_lines bevat zo'n 300.000 records
statecodes tabel heeft een vrij nutteloze index (in een wanhopige poging aangemaakt) op end_status
invoices heeft meerdere indexen, maar ook 1 op statecodeid
invoice_lines heeft een index op invoiceid
nu wil ik een overzicht van alle invoices (+ wat info uit de invoice_lines) die een statuscode hebben waarvoor de end_status = false... dit zijn zo'n 100 orders max.
dus een simpele query:
als ik echter nu een EXPLAIN doe op deze query, zie ik dat MySQL uit zichzelf invoices als basistabel neemt en dus feitelijk de query zo uitvoert:
ik krijg het vermoeden dat het iets te maken heeft met het aantal records in invoices... dat die tabel daarom voorrang krijgt en als basistabel wordt gebruikt... maar dat wil ik helemaal niet...
ik weet zeker dat er maar max 100 orders zullen zijn met een end_status = 0... dus de query zou, als hij hem uitvoert zoals ik hem origineel intyp, gewoon snel moeten zijn...
mijn vragen:
- maak ik een denkfout?
- is er een manier om MySQL te zeggen welke tabel de basistabel moet zijn (behalve de volgorde van de aanroep van de tabellen.. want dat werkt blijkbaar niet).
ik heb 3 tabellen:
- statecodes
- invoices
- invoice_lines
de tabel statecodes bevat zo'n 12 statussen waarvan er 5 het vinkje "end_status" op false hebben staan.
de tabel invoices bevat zo'n 50.000 records
de tabel invoice_lines bevat zo'n 300.000 records
statecodes tabel heeft een vrij nutteloze index (in een wanhopige poging aangemaakt) op end_status
invoices heeft meerdere indexen, maar ook 1 op statecodeid
invoice_lines heeft een index op invoiceid
nu wil ik een overzicht van alle invoices (+ wat info uit de invoice_lines) die een statuscode hebben waarvoor de end_status = false... dit zijn zo'n 100 orders max.
dus een simpele query:
niet al te spannend...select bla
from statecodes
left join invoices on statecodes.id = invoices.statecodeid
left join invoice_lines on invoices.id = invoice_lines.invoiceid
where statecodes.end_status = 0
als ik echter nu een EXPLAIN doe op deze query, zie ik dat MySQL uit zichzelf invoices als basistabel neemt en dus feitelijk de query zo uitvoert:
als ik de invoice_lines join weghaal, dan neemt hij wel keurig statecodes als basistabel...select bla
from invoices
left join statecodes on statecodes.id = invoices.statecodeid
left join invoice_lines on invoices.id = invoice_lines.invoiceid
where statecodes.end_status = 0
ik krijg het vermoeden dat het iets te maken heeft met het aantal records in invoices... dat die tabel daarom voorrang krijgt en als basistabel wordt gebruikt... maar dat wil ik helemaal niet...
ik weet zeker dat er maar max 100 orders zullen zijn met een end_status = 0... dus de query zou, als hij hem uitvoert zoals ik hem origineel intyp, gewoon snel moeten zijn...
mijn vragen:
- maak ik een denkfout?
- is er een manier om MySQL te zeggen welke tabel de basistabel moet zijn (behalve de volgorde van de aanroep van de tabellen.. want dat werkt blijkbaar niet).