Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Slome query?

Pagina: 1
Acties:

  • Saven
  • Registratie: December 2006
  • Laatst online: 14:39

Saven

Administrator

Topicstarter
Hey Tweakers,
Sorry :P Maar alweer even een topic van mij in dit forum.

Ik heb een vervelend probleempje, namelijk dat een query die ik uitvoer 0,15 seconden ongeveer kost.
Dat komt door de LEFT JOIN blijkbaar die ik gebruik:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    private function __get_news($limit)
    {
        $query = $this->core->db->query
        ('
            SELECT
                n.id, n.tijd, n.gesloten, n.titel, n.bericht, n.avatar, COUNT(r.id) as reacties
            FROM
                nieuws n
            LEFT JOIN
                nieuwsreacties r ON (r.nid = n.id)
            GROUP BY
                n.id
            ORDER BY
                n.id DESC
            LIMIT
                '.$limit.'
        ');
        
        if( $query->rowCount() == 0 )
        {
            return false;
        }
        else
        {
            return $query->fetchAll(PDO::FETCH_ASSOC);
        }
    }


Nu moet ik wel LEFT JOIN volgensmij gebruiken omdat ik ook wil dat hij nieuwsreacties laat zien waar nog geen reacties op zijn geweest. Met INNER JOIN en RIGHT JOIN gaat dat dus niet lukken, terwijl die 2 joins aanmerkelijk sneller zijn (zo'n 0,03 seconden).

Kan iemand mij misschien uitleggen wat ik nu het beste kan doen? Een parsetime van 0,15 seconden voor alleen het nieuws opvragen is mij een beetje te veel van het goede namenlijk.

Alvast bedankt :)

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Draai die query eens in PHPMyAdmin met voor de query EXPLAIN. Dan krijg je een mooi overzicht terug met daarin informatie over je query.

[ Voor 3% gewijzigd door RAJH op 24-04-2008 14:13 ]


  • Pete
  • Registratie: November 2005
  • Laatst online: 31-10 12:38
Naast dat ik je adviseer al je niet geaggregeerde kolommen op te nemen in je Group By is er hier 1 ding van belang: indexen

Doe eens een Explain en kijk wat eruit komt

petersmit.eu


  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Ik gok je je indexes eens moet controleren. Haal je query eens door EXPLAIN en (vanaf MySQL 5.0.37) door de profiler. :)

Sole survivor of the Chicxulub asteroid impact.


  • Saven
  • Registratie: December 2006
  • Laatst online: 14:39

Saven

Administrator

Topicstarter
Dit komt er uit met EXPLAIN:
Afbeeldingslocatie: http://www.imgdumper.com/file/img/2008/apr/24/img/ctajv14yhf81n3dgsmh9vt1pu.gif

Heb er niet zo veel verstand van :P
Verbaast me trouwens wel dat als ik de query uitvoer in phpmyadmin zelf (zonder explain) dat hij dan wel snel gaat..

[ Voor 5% gewijzigd door Saven op 24-04-2008 14:21 ]


  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Zou je voor de volledigheid ook nog even je database schema willen posten? En dat de query opeens wel snel gaat komt waarschijnlijk door de caching functies van MySQL.

[ Voor 38% gewijzigd door RAJH op 24-04-2008 14:28 ]


  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Gooi op r.nid en n.id eens een index?

Sole survivor of the Chicxulub asteroid impact.


  • Saven
  • Registratie: December 2006
  • Laatst online: 14:39

Saven

Administrator

Topicstarter
AtleX dankjewel! En de rest ook natuurlijk :) Index erop gooien heeft idd enorm veel effect :P.
Zou je misschien uit kunnen leggen wat het nut is van de de Index dan? Want dan zal dit vast en zeker ook wel bij overige querys helpen ;)

Thnx :)!

  • JortK
  • Registratie: Mei 2007
  • Laatst online: 26-09-2022
LEFT OUTER JOIN wil je query nog wel eens wat trager maken.

Leg eens een index aan op r.nid en n.id zoals AtleX ook al zegt.

En waarom trouwens die ORDER BY?

Sorteren van je data doe je toch niet al op database niveau, dit kun je toch in je PHP code doen?

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 12:10
Waren die velden geen Primaty Keys van je tabel dan ? :X Normaal gesproken is een primary key automatisch al een index namelijk....
JortK schreef op donderdag 24 april 2008 @ 14:28:
Sorteren van je data doe je toch niet al op database niveau, dit kun je toch in je PHP code doen?
Waarom niet? Je DB is prima geschikt om te sorteren hoor, of dacht je dat die order by er voor de gein in zat ? :)

[ Voor 55% gewijzigd door Morax op 24-04-2008 14:30 ]

What do you mean I have no life? I am a gamer, I got millions!


  • JortK
  • Registratie: Mei 2007
  • Laatst online: 26-09-2022
Saven schreef op donderdag 24 april 2008 @ 14:27:
AtleX dankjewel! En de rest ook natuurlijk :) Index erop gooien heeft idd enorm veel effect :P.
Zou je misschien uit kunnen leggen wat het nut is van de de Index dan? Want dan zal dit vast en zeker ook wel bij overige querys helpen ;)

Thnx :)!
Dit is je perfecte startpunt om daar de voordelen van in te zien en te zien hoe MySQL ermee omgaat :)

  • JortK
  • Registratie: Mei 2007
  • Laatst online: 26-09-2022
Morax schreef op donderdag 24 april 2008 @ 14:29:
Waarom niet? Je DB is prima geschikt om te sorteren hoor, of dacht je dat die order by er voor de gein in zat ? :)
Hij zal er vast een reden voor hebben, maar ik persoonlijk sorteer de data nooit op database niveau, maar dat ligt maar net aan de situatie waar TS het voor gebruikt :)

  • Saven
  • Registratie: December 2006
  • Laatst online: 14:39

Saven

Administrator

Topicstarter
Morax schreef op donderdag 24 april 2008 @ 14:29:
Waren die velden geen Primaty Keys van je tabel dan ? :X Normaal gesproken is een primary key automatisch al een index namelijk....


[...]


Waarom niet? Je DB is prima geschikt om te sorteren hoor, of dacht je dat die order by er voor de gein in zat ? :)
Ze waren wel primary keys natuurlijk, maar geen index blijkbaar :P

JortK ook dankjewel :)

Iedereen bedankt voor hun hulp d:)b

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Morax schreef op donderdag 24 april 2008 @ 14:29:
[...]


Waarom niet? Je DB is prima geschikt om te sorteren hoor, of dacht je dat die order by er voor de gein in zat ? :)
Nou ja, als je zo gaat redeneren kun je met de huidige functionaliteit in MySQL je halve PHP code opdoeken ;). Maar inderdaad, sorteren is een klus die je mooi met de database-functionaliteit kunt doen, kun je ook meteen op meerdere kolommen sorteren zonder er al te veel bij hoeven na te denken.

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
JortK schreef op donderdag 24 april 2008 @ 14:28:
LEFT OUTER JOIN wil je query nog wel eens wat trager maken.

Leg eens een index aan op r.nid en n.id zoals AtleX ook al zegt.

En waarom trouwens die ORDER BY?

Sorteren van je data doe je toch niet al op database niveau, dit kun je toch in je PHP code doen?
Als hij in zijn PHP code gaat sorteren krijgt hij een ander resultaat...

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Saven schreef op donderdag 24 april 2008 @ 14:32:
[...]
Ze waren wel primary keys natuurlijk, maar geen index blijkbaar :P
Waarschijnlijk zat er geen index op op nid uit de nieuwsreacties tabel. nid is hier geen primary key. nid is alleen een primary key in de nieuws tabel.

If it isn't broken, fix it until it is..


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 14:25

Koppensneller

winterrrrrr

JortK schreef op donderdag 24 april 2008 @ 14:28:
LEFT OUTER JOIN wil je query nog wel eens wat trager maken.

Leg eens een index aan op r.nid en n.id zoals AtleX ook al zegt.

En waarom trouwens die ORDER BY?

Sorteren van je data doe je toch niet al op database niveau, dit kun je toch in je PHP code doen?
En waarom zou je dat niet in de je DB willen doen? :?

edit:
Spuit 11, note to self: een tab niet 10 minuten open laten staan ;)

[ Voor 8% gewijzigd door Koppensneller op 24-04-2008 14:43 ]


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 12:10
mcdronkz schreef op donderdag 24 april 2008 @ 14:32:
[...]


Nou ja, als je zo gaat redeneren kun je met de huidige functionaliteit in MySQL je halve PHP code opdoeken ;). Maar inderdaad, sorteren is een klus die je mooi met de database-functionaliteit kunt doen, kun je ook meteen op meerdere kolommen sorteren zonder er al te veel bij hoeven na te denken.
Ik geef toe dat het argument van die ORDER BY nergens op slaat, maar je DB is ten eerste gewoon zeer geschikt om te sorteren, en ten tweede moet je de DB soms wel laten sorteren, omdat je anders gewoon niet het resultaat krijgt dat je zou willen.

Hoe haal je anders de laatste 5 items op uit een tabel bijvoorbeeld, zonder die data te sorteren in je query ?

What do you mean I have no life? I am a gamer, I got millions!


  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Morax schreef op donderdag 24 april 2008 @ 14:45:
[...]


Ik geef toe dat het argument van die ORDER BY nergens op slaat, maar je DB is ten eerste gewoon zeer geschikt om te sorteren, en ten tweede moet je de DB soms wel laten sorteren, omdat je anders gewoon niet het resultaat krijgt dat je zou willen.

Hoe haal je anders de laatste 5 items op uit een tabel bijvoorbeeld, zonder die data te sorteren in je query ?
Dan moet je eerst gaan tellen hoeveel items er in je resultset zitten, en dan in de loop waarin ze weergegeven worden een check uitvoeren of je wel met de laatste 5 items te maken hebt ofzo. :P Dat is dus vrijwel onmogelijk. Helemaal als ze schots en scheef door elkaar staan.

Nee hoor, gewoon lekker sorteren in je DB, why not.

- edit -

Nou ja, onmogelijk is een groot woord, maar het is niet de weg die je wilt bewandelen denk ik.

[ Voor 6% gewijzigd door mcdronkz op 24-04-2008 14:56 ]


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

En daarnaast kan een zichzelf respecterend relationele database de data ontegenzeglijk véél efficienter sorteren dan een of ander functie in een willekeurig programmeertaal.

[ Voor 3% gewijzigd door BalusC op 24-04-2008 14:57 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:03
[b][message=29973729,noline]
En waarom trouwens die ORDER BY?

Sorteren van je data doe je toch niet al op database niveau, dit kun je toch in je PHP code doen?
:o
waarom ?
Waarom zou je de DB niet laten doen waar ze goed in is ? Ga jij maar ff 100.000 rows gaan sorteren in php. Welke sort implementatie ga je daarvoor gebruiken ? Wat is het voordeel om je sortering in php te doen ?

[ Voor 23% gewijzigd door whoami op 24-04-2008 16:07 ]

https://fgheysels.github.io/


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

JortK schreef op donderdag 24 april 2008 @ 14:31:
[...]
Hij zal er vast een reden voor hebben, maar ik persoonlijk sorteer de data nooit op database niveau, maar dat ligt maar net aan de situatie waar TS het voor gebruikt :)
Dat is leuk met resultsets van miljoenen records, om die daarna nog even in je code te gaan sorteren. Hopen dat je server voldoende geheugen heeft om dat 2 keer tegelijk te doen. Of ga je het zelf wegswappen?

Volgens mij ga je precies de verkeerde kant op door het niet in de database op te lossen.

  • !null
  • Registratie: Maart 2008
  • Laatst online: 18-11 11:06
Sorteren is iets wat bij de 'Datalaag' hoort. Je zou het eventueel ook als weergave kunnen zien, maar sortering hangt vaak samen met het maken van een bepaalde selectie. En tja, de performance is al reden genoeg.

Ampera-e (60kWh) -> (66kWh)


  • PainkillA
  • Registratie: Augustus 2004
  • Laatst online: 11:44
een count kan ook nogal zwaar meetellen op grote hoeveelheden. Kan je mischien beter naderhand met php doen. Ook is een order by vertragend. Verder als die id's waarop je joined primary key zijn heeft het geen extra nut om daar indexes op te leggen. Dit gebeurt al automatisch.

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 18-11 19:30

Sebazzz

3dp

Even iets wat niet met SQL te maken heeft aar met de code, als dat mag: PHP.net raadt het af om methodes met twee underscores te laten beginnen (__) omdat dat gereserveerd is voor Zend framework en PHP methodes. Het werkt nu misschien, maar misschien in de toekomst niet ;)

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • paulh
  • Registratie: Juli 1999
  • Laatst online: 10-11 10:50
PainkillA schreef op donderdag 24 april 2008 @ 19:09:
een count kan ook nogal zwaar meetellen op grote hoeveelheden. Kan je mischien beter naderhand met php doen. Ook is een order by vertragend. Verder als die id's waarop je joined primary key zijn heeft het geen extra nut om daar indexes op te leggen. Dit gebeurt al automatisch.
Ja, alleen een beetje jammer dat je in mysql niet kan aangeven of een index ascending of descending gesorteerd moet zijn. Is nu altijd ascending.

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 18-11 14:49
paulh schreef op donderdag 24 april 2008 @ 20:17:
[...]
Ja, alleen een beetje jammer dat je in mysql niet kan aangeven of een index ascending of descending gesorteerd moet zijn. Is nu altijd ascending.
Is ook niet nodig. Je kunt gewoon "order by ... desc" geven. Die maakt gewoon gebruik van de key die asccending gesorteerd is.

Verwijderd

paulh schreef op donderdag 24 april 2008 @ 20:17:
Ja, alleen een beetje jammer dat je in mysql niet kan aangeven of een index ascending of descending gesorteerd moet zijn. Is nu altijd ascending.
Descending indices heb ik na m'n Clipper-tijd nooit meer gezien of nodig gehad. Een beetje RDBMS weet echt wel of 'ie een ascending index van voor naar achter of andersom moet gebruiken...

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Sidenote: als je performance van queries aan het testen ben, kan je zorgen dat de query niet gecached wordt door direct na de SELECT het keyword 'query_no_cache' zie onder bij AtleX te zetten.
Verwijderd schreef op donderdag 24 april 2008 @ 22:46:
Descending indices heb ik na m'n Clipper-tijd nooit meer gezien of nodig gehad. Een beetje RDBMS weet echt wel of 'ie een ascending index van voor naar achter of andersom moet gebruiken...
Je RDBMS kan niet raden welke queries je er op los gaat laten en kan dus niet op voorhand de index optimaliseren voor die queries. In DB2 kan je daarom expliciet aangeven in welke volgorde de index gesorteerd moet zijn. Ik heb nog niet gehoord van een systeem dat adaptief zijn indices aanpast aan de queries die er het meest op worden losgelaten.

Wie trösten wir uns, die Mörder aller Mörder?


  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Confusion schreef op vrijdag 25 april 2008 @ 19:48:
Sidenote: als je performance van queries aan het testen ben, kan je zorgen dat de query niet gecached wordt door direct na de SELECT het keyword 'query_no_cache' te zetten.
Kleine correctie. Het is "SQL_NO_CACHE", bijvoorbeeld:
SQL:
1
SELECT SQL_NO_CACHE FROM users;

Sole survivor of the Chicxulub asteroid impact.

Pagina: 1