Ik heb twee queries die uitgevoerd worden voor een latest releases pagina op een muziek download site.
De queries zijn gebaseerd op 3 tabellen: tracks, albums en search_table.
De search_table bestaat uit de velden: track_id, album_id en release_date
De tabellen tracks en albums hebben alle twee een id en verdere info zoals: title, version, artist, label, release_date, etc... Daarnaast is de albums tabel gevuld met enkele duizenden albums en de tracks tabel met enkele tienduizenden tracks.
De queries zien er als volgt uit:
Het probleem is dat de count query er minimaal 1,5 seconde over doet terwijl de select query er maar 0,05 seconde over doet.PHP Code:
$count = "
SELECT COUNT(*) AS `numrows`
FROM (`search_table`)
LEFT JOIN `tracks` ON (`tracks`.`id` = `search_table`.`track_id` AND `tracks`.`enabled` = 1)
LEFT JOIN `albums` ON (`albums`.`id` = `search_table`.`album_id` AND `albums`.`enabled` = 1)
WHERE `release_date` <= 1308740400 ";
$select = "
SELECT `tracks`.*, `albums`.*
FROM (`search_table`)
LEFT JOIN `tracks` ON (`tracks`.`id` = `search_table`.`track_id` AND `tracks`.`enabled` = 1)
LEFT JOIN `albums` ON (`albums`.`id` = `search_table`.`album_id` AND `albums`.`enabled` = 1)
WHERE `release_date` <= 1308740400
ORDER BY `release_date` DESC
LIMIT 0, 25 ";
Is er iets waarmee ik de count query sneller kan maken? Het optimaliseren van de tabellen in PHPMyAdmin heb ik al gedaan en had helaas niet het gewenste resultaat.
- MySQL COUNT() is erg traag
-
22-06-2011, 12:10 #1
- Berichten
- 40
- Lid sinds
- 14 Jaar
MySQL COUNT() is erg traag
-
-
22-06-2011, 12:14 #2
- Berichten
- 1.410
- Lid sinds
- 16 Jaar
Re: MySQL COUNT() is erg traag
Doe eens ipv count(*) count(`id`).
Geen idee of het uitmaakt maar valt te proberen :P
-
22-06-2011, 12:15 #3
Elephant Media GbR
- Berichten
- 1.253
- Lid sinds
- 18 Jaar
Re: MySQL COUNT() is erg traag
Hoeveel rijen staan er in. Het is logisch dat de 2de query sneller is omdat er een limit 0,25 in staat.
-
22-06-2011, 12:16 #4
- Berichten
- 40
- Lid sinds
- 14 Jaar
-
22-06-2011, 12:18 #5
- Berichten
- 1.410
- Lid sinds
- 16 Jaar
-
22-06-2011, 12:19 #6
- Berichten
- 40
- Lid sinds
- 14 Jaar
-
22-06-2011, 12:23 #7
- Berichten
- 16
- Lid sinds
- 16 Jaar
Re: MySQL COUNT() is erg traag
Je zegt dat je database hebt geoptimimaliseerd, heb je indexes en foreign keys gemaakt(voor dat laatste moet je innoDB gaan gebruiken)? Probeer je trouwens het aantal searchresults, aantal albums of aantal tracks te tellen?
-
22-06-2011, 12:31 #8
- Berichten
- 40
- Lid sinds
- 14 Jaar
Re: MySQL COUNT() is erg traag
Voor de tabellen tracks en albums is er een primary key ingesteld op id.
Voor de tabel search_table zijn er indexen aangemaakt op track_id,album_id en release_date.
De type van alle tabellen staat op MyISAM.
De COUNT() is voor het totaal aantal tracks & albums, ook na een zoekopdracht naar bijvoorbeeld een artiest of label.
-
22-06-2011, 13:04 #9
- Berichten
- 16
- Lid sinds
- 16 Jaar
Re: MySQL COUNT() is erg traag
Voor de tabellen tracks en albums is er een primary key ingesteld op id.
Voor de tabel search_table zijn er indexen aangemaakt op track_id,album_id en release_date.
De type van alle tabellen staat op MyISAM.
De COUNT() is voor het totaal aantal tracks & albums, ook na een zoekopdracht naar bijvoorbeeld een artiest of label.
Verder lijkt me een preformance probleem dat je eerst joined en dan pas gaat selecteren via een WHERE clause:
Even een probeersel volgens mij is LEFT JOIN niet nodig gezien je altijd een album en track hebt?
Code:SELECT COUNT(search_table.id) AS `numrows` FROM search_table WHERE search_table.release_date <= 1308740400 AND tracks.enabled =1 AND albums.enabled =1 AND tracks.id = search_table.track_id AND search_table.album_id = albums.id
Succes ermee!Laatst aangepast door S.Voss : 22-06-2011 om 13:05 Reden: foutje in query
-
22-06-2011, 13:12 #10
- Berichten
- 40
- Lid sinds
- 14 Jaar
Re: MySQL COUNT() is erg traag
Een COUNT() zonder de LEFT JOIN is miliseconden werk, maar de query zoals jij hem opgeeft produceert een "Unknown column" error.
Op zich zou een COUNT() van 35.000 rows geen laadtijd van 1,5sec mogen opleveren. Als je een simpele query als 'SELECT COUNT(*) FROM search_table' uitvoerd wat voor een laadtijd krijg je dan? Probleem zou kunnen zijn dat je verkeerde datatypes gebruikt zoals bigints waar normale ints gebruikt kunnen worden.
Verder lijkt me een preformance probleem dat je eerst joined en dan pas gaat selecteren via een WHERE clause:
Even een probeersel volgens mij is LEFT JOIN niet nodig gezien je altijd een album en track hebt?
Code:SELECT COUNT(search_table.id) AS `numrows` FROM search_table WHERE search_table.release_date <= 1308740400 AND tracks.enabled =1 AND albums.enabled =1 AND tracks.id = search_table.track_id AND search_table.album_id = albums.id
Succes ermee!
-
22-06-2011, 13:16 #11
- Berichten
- 16
- Lid sinds
- 16 Jaar
-
22-06-2011, 13:17 #12
- Berichten
- 40
- Lid sinds
- 14 Jaar
-
22-06-2011, 13:58 #13
- Berichten
- 690
- Lid sinds
- 15 Jaar
Re: MySQL COUNT() is erg traag
misschien mysql_num_rows() gebruiken ipv count?
-
22-06-2011, 13:58 #14
- Berichten
- 16
- Lid sinds
- 16 Jaar
-
22-06-2011, 14:15 #15
- Berichten
- 40
- Lid sinds
- 14 Jaar
Re: MySQL COUNT() is erg traag
Ik heb de COUNT() query maar opgesplitst in 2 aparte COUNT() queries, laadtijd is nu minder dan 0,1 seconde op z'n hoogst bij elkaar opgeteld. Hier kan ik enigszins mee leven.
Bedankt voor de hulp allemaal!
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic