Verstand van Voip? Ik heb een leuke baan voor je!
The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.
Een Primary en een Unique??!?! Anyway, heb het geprobeerd, maar geen resultaat. Nog steeds using filesort.
Laat ik echter title uit de query weg, dan gebruikt mysql idd de index. Een index op title en id zou misschien ook nog kunnen...
Tux schreef op vrijdag 27 januari 2006 @ 14:04:
En als je id de primary key maakt?
[ Voor 21% gewijzigd door megamuch op 27-01-2006 14:10 ]
Verstand van Voip? Ik heb een leuke baan voor je!
En puur dat gebruiken om je query te classificeren als langaam lijkt me ook wat overkill. Hoe lang duurt je query eigenlijk in het echt?
En de unique kun je uiteraard verwijderen als je er een PK op legt.
[ Voor 89% gewijzigd door Bosmonster op 27-01-2006 14:11 ]
phpmyadmin 2.7x pikt dit niet volgens mij, want dit is automatisch al zo.
Verder maak ik van de ID altijd een Primarykey (int veld van 10 oid), vervolgens een auto increment erop gooien.
[ Voor 45% gewijzigd door DDemolition op 27-01-2006 14:12 ]
Specs: Server, WS boven, WS beneden
Nou ja.. het komt in m'n slow query log van Mysql terecht. En aangezien ik die logfile op dit moment aan het analyseren ben om alle queries die ik uitvoer te verbeteren dmv indexen, wilde ik deze query ook optimalizeren.Bosmonster schreef op vrijdag 27 januari 2006 @ 14:10:
Wat is er mis met 'using filesort'
En puur dat gebruiken om je query te classificeren als langaam lijkt me ook wat overkill. Hoe lang duurt je query eigenlijk in het echt?
Kijk de query duurt niet lang... 300 records sorteren duurt nooit lang, maar als het sneller kan, dan altijd ofcourse.
En ik was altijd van mening dat "using filesort " niet juist was mbt indexen, maar jij zegt dat er niks mis met "using Filesort" is.
[ Voor 7% gewijzigd door megamuch op 27-01-2006 14:49 ]
Verstand van Voip? Ik heb een leuke baan voor je!
Trouwens, het plaatsen van een index is niet altijd een garantie dat die index daadwerkelijk zal gebruikt worden. Het is ook niet altijd zo dat gebruik maken van een index de efficienste manier is om een query uit te voeren.
De meeste DBMS'en zijn intelligent genoeg om te bepalen welk execution plan het beste is, en in sommige gevallen kan het zo zijn, dat het beter is om de index niet te gebruiken.
[ Voor 83% gewijzigd door whoami op 27-01-2006 14:50 ]
https://fgheysels.github.io/
Verwijderd
De index wordt gebruikt om de rijen te sorteren, maar de server moet dan nog steeds op zoek gaan naar de waarde van de tweede kolom. Als je die ook in de index zet, dan hoeft dat niet meer te gebeuren en daalt (in theorie
Maar zoals ik zei, heb alleen MSSQL-kennis, geen MySQL.
[ Voor 18% gewijzigd door Verwijderd op 27-01-2006 15:03 ]
Je haalt de volledige tabel over, logisch dat er geen index gebruikt wordt.megamuch schreef op vrijdag 27 januari 2006 @ 14:02:
SQL:
1 SELECT id, title FROM articles ORDER BY id ASC;
Het lijkt me dat als je id primary key maakt + een index daarop legt, dat je dan de snelste methode hebt om alle records gesorteerd en wel op te halen met deze query.
(Primary key is vaak een hash-achtig iets, vandaar dat het soms loont om er nog een index op te zetten).
Een rij is een rij hoor. Het zou toch al te mal zijn dat ieder rijen kolom voor kolom bij elkaar gequeried zouden worden door het DBMS. ;-)Verwijderd schreef op vrijdag 27 januari 2006 @ 15:00:
De index wordt gebruikt om de rijen te sorteren, maar de server moet dan nog steeds op zoek gaan naar de waarde van de tweede kolom. Als je die ook in de index zet, dan hoeft dat niet meer te gebeuren en daalt (in theorie) het aantal IO-acties
[knip]
Maar zoals ik zei, heb alleen MSSQL-kennis, geen MySQL.
[ Voor 36% gewijzigd door Varienaja op 27-01-2006 15:13 ]
Siditamentis astuentis pactum.
Als je alleen geindexeerde velden selecteert, hoeft er niet meer in de tabel gekeken worden, dat is wel degelijk sneller.Varienaja schreef op vrijdag 27 januari 2006 @ 15:11:
Een rij is een rij hoor. Het zou toch al te mal zijn dat ieder rijen kolom voor kolom bij elkaar gequeried zouden worden door het DBMS. ;-)
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
En het sorteren gebruikt geen indices?Varienaja schreef op vrijdag 27 januari 2006 @ 15:11:
[...]
Je haalt de volledige tabel over, logisch dat er geen index gebruikt wordt.
In MS-SQL zou je een clustered index kunnen zetten op dat id veld (mits dat id-veld nooit veranderd -wat een id veld nooit zou moeten doen- en, mits het id veld geen GUID veld is, maar een identity bv.Verwijderd schreef op vrijdag 27 januari 2006 @ 15:00:
Geen MySQL kennis, maar normaliter zou ik dan de tweede kolom includen in de index...
De index wordt gebruikt om de rijen te sorteren, maar de server moet dan nog steeds op zoek gaan naar de waarde van de tweede kolom. Als je die ook in de index zet, dan hoeft dat niet meer te gebeuren en daalt (in theorie) het aantal IO-acties. De optimizer vind dan in veel gevallen het sneller om dan geen indexen te gebruiken (het resultaat met 300 rijen past toch makkelijk in het werkgeheugen/cache)...
Maar zoals ik zei, heb alleen MSSQL-kennis, geen MySQL.
Dan heb je direct de snelste manier om die query uit te voeren. Je clustered index bepaald nl. de fysieke opslagvolgorde van je records, dus, je kan hier gewoon de tabel van voor naar achter uitlezen, en hij is al direct gesorteerd.
https://fgheysels.github.io/
Als er een index op id was, en je sorteert op id, dan kan de index gebruikt worden. Dat zeg ik toch ook:Bosmonster schreef op vrijdag 27 januari 2006 @ 15:31:
En het sorteren gebruikt geen indices?
Het lijkt me dat als je id primary key maakt + een index daarop legt, dat je dan de snelste methode hebt om alle records gesorteerd en wel op te halen met deze query.
Siditamentis astuentis pactum.
Staan alle velden dan dubbel in de database? Een keer in de tabel, en een keer in de index? Dat wist ik niet. Ik heb zelf wel eens een database-je geprogrammeerd, en dan zaten alle gegevens in de tabel, en was de index niet meer dan een B-boom met recordpointers die naar rijen in de tabel wezen. Ik dacht altijd dat dat bij echte databases ook wel zo zou werken. :-)kenneth schreef op vrijdag 27 januari 2006 @ 15:14:
Als je alleen geindexeerde velden selecteert, hoeft er niet meer in de tabel gekeken worden, dat is wel degelijk sneller.
Siditamentis astuentis pactum.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Een PK (in MySQL tenminste) is gewoon een index voor zover ik weet. Daar ook nog een keer een losse index op leggen is dus dubbelop.Varienaja schreef op vrijdag 27 januari 2006 @ 16:36:
[...]
Als er een index op id was, en je sorteert op id, dan kan de index gebruikt worden. Dat zeg ik toch ook:
[...]
OK. Ik had in Postgres een keer trage resultaten, en dat bleek te komen doordat m'n PK daar een hash was.Bosmonster schreef op vrijdag 27 januari 2006 @ 16:51:
Een PK (in MySQL tenminste) is gewoon een index voor zover ik weet. Daar ook nog een keer een losse index op leggen is dus dubbelop.
"where id=6" gaat dan wel snel, maar "where id>6" niet zo :-D
Siditamentis astuentis pactum.