Toon posts:

[mysql] subquery enorm traag

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hi mensen,

ik heb me even verdiept in de subqueries van mysql (via PDO)
De volgende query doet in feite precies wat ik wil echter de doorvoersnelheid is om te huilen.
Hebben jullie dezelfde ervaringen of is er eventueel een optimalisatieslag aan te brengen?
Ik ben nu nl. geneigd om de hele COUNT-subquery eruit te halen en deze vervolgens maar per resultrow op te gaan vragen.

In de images tabel staan nu +- 40000 items, lijkt me niet echt een probleem toch?

MySQL:
1
2
3
4
5
6
7
8
'SELECT * , (
                COUNT( id )
                    FROM images AS i
                    WHERE i.images_cat_id = c.id
                ) AS aantalimages
                
                FROM category AS c
                WHERE category_id=:category_id'             

Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 25-09 16:11

killercow

eth0

subqueries doen geen index lookup geloof ik, dan kan wel eens verklaren waarom het zo vreselijk traag is.

Misschien kun je het oplossen met een join?

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Gewoon een GROUP BY gebruiken:

SQL:
1
2
3
4
SELECT category.veldje, COUNT(*) as aantalimg
FROM category c
INNER JOIN images i on c.cat_id = i.cat_id
GROUP BY category.veldje

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@P_de_B: Thanks!! d:)b

die innerjoin is inderdaad een stuk sneller!
Toch jammer want ik vind zo'n subquery nog wat leesbaarder...

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Je wilt nu het aantal afbeeldingen per categorie tellen toch? Is het niet handig om een dergelijke query b.v. 1 of enkele keren per dag uit te voeren in een cronjob of zo, en deze dan op te slaan in een tabel/textfile?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Noork Dat zou een optie zijn maar ik probeer het in eerste instantie toch nog op deze manier.

@P_de_B: Ik merk wel dat ik nu enkel alle rijen terugkrijg waarvan aantalimages > 0?
Oftewel enkel wanneer de COUNT > 0 is.
Kan ik ook alle categorieen tonen ?
Ik kan dit aanpassen met een LEFT JOIN maar dan ben ik mijn snelheidvoordeel weer kwijt merk ik
P_de_B schreef op maandag 15 december 2008 @ 10:35:
Gewoon een GROUP BY gebruiken:

SQL:
1
2
3
4
SELECT category.veldje, COUNT(*) as aantalimg
FROM category c
INNER JOIN images i on c.cat_id = i.cat_id
GROUP BY category.veldje

[ Voor 45% gewijzigd door Verwijderd op 15-12-2008 11:14 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Eventueel zou je een 2e query kunnen doen als volgt
SQL:
1
2
3
SELECT category.veldje, 0 as aantalimg 
FROM category c 
WHERE c.cat_id not in ( select i.cat_id from images i )

Ik weet niet of dat wel snel is, maar dan zou je eventueel een union kunnen maken van die 2 query's

( Een andere optie is over stappen op een DBMS die wel fatsoenlijk gebruik maakt van indexes, maar dat is natuurlijk niet altijd een optie ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1