Citat:
Ursprungligen postat av
fnirp
Hinner tyvärr inte skriva något utförligt svar nu, men fem minuter för så få records verkar galet. Får du till någon cross join? Dvs databasen får jobba med ett 10 000 * 24 000 * 9 000 = 2160 miljarder poster stort recordset värsta fall.
När jag började min databaskarriär, var databasmotorernas egen optimering av sql-koden usel, så då byggde man frågan från den minsta tabellen till den största tabellen om det gick... Dvs i ditt fall tender_nuts joinas med tender som joinas med tender_cpv. Kan vara ett tips på vägen.
Indexering är en annan prestationshöjare. Har du index på de kolumner du joinar med?
Ja asså jag blir galen, fattar inte hur det kan ta så lång tid.
Jag har index på allt jag använder i mina joins och i where clause.
Så här ser en explain ut av själva queryin:
Kod:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE account_listener ALL cpv_code,nuts_code NULL NULL NULL 1 NULL
1 SIMPLE tender_nuts index NULL nuts_code 10 NULL 9373 Using where; Using index; Using join buffer (Block Nested Loop)
1 SIMPLE tender eq_ref PRIMARY PRIMARY 152 func 1 Using where
1 SIMPLE tender_cpv index NULL cpv_code 10 NULL 26644 Using where; Using index; Using join buffer (Block Nested Loop)
Har testat att skriva queryin på 100 olika sätt men varje gång jag blandar in tender_nuts så går allting åt helvete. Det är precis som att det är för många joins.
Jag vill helt enkelt ha ut alla tender som matchar personens bevakning genom att joina account_listener mot tender_cpv & tender_nuts och skriva ut resultatet som joinas mot tabellen tender.
PS:
Tog bort indexen eftersom jag bytte namn på någon kolumn (vet inte om det var reindexeringen som hjälpte), ändrade queryin till:
[PHP]
SELECT * FROM account_listener AL
JOIN tender_nuts TN ON TN.nuts_code = AL.nuts_2003_code
JOIN tender_cpv TC ON TC.cpv_code = AL.cpv_code AND TC.document_number = TN.document_number
JOIN tender T ON T.document_number = TC.document_number
[/PHP]
och helt plötsligt tog det 0.01 sek...