query traag
Als ik in een keer 10.000 resultaten wil ophalen in mijn listing pagina gaat het erg traag.
Waaraan moet een snel script of query voldoen?
Groeten,
Michiel
Waaraan moet een snel script of query voldoen?
Groeten,
Michiel
Kunnen we zo niet zeggen, meestal is het niet de query die traag is maar iets in je php script (bv type conversie)
Indexes in je database kunnen ook een hoop schelen. Ook is het handig om je query te vermelden.
Dit is de query: $query = "SELECT productID, categoryID, subcategoryID, fotoProduct1, productNAME, what, productNAME, name, remarks, totalMinimum, pricePer, businessprotection, productPRICE, currency, pricePerOne, unitSet, moreInStock, createDATUM, createTIJD, country FROM useraccount, product WHERE useraccount.PIDID = product.PIDID ORDER BY $sort LIMIT $offset, $limit ";
Wat bedoel je precies met de indexes in de database? (bijvoorbeeld aantal kolommen of de waardes van kolommen zoals varchar etc?
Wat bedoel je precies met de indexes in de database? (bijvoorbeeld aantal kolommen of de waardes van kolommen zoals varchar etc?
Maak de query eerst eens zoals het hoort met joins.
ie:
Op jouw manier laat je mysql maar uitzoeken in welke tabel een kolom staat, en dat maakt de quey trager.
ie:
Code (php)
1
2
3
4
2
3
4
SELECT t1.field1 t1f1, t1.field2 t1f2, t2.field2 t2f2
#enzovoort
FROM table1 t1
JOIN table2 t2 ON t1.field1=t2.field2
#enzovoort
FROM table1 t1
JOIN table2 t2 ON t1.field1=t2.field2
Op jouw manier laat je mysql maar uitzoeken in welke tabel een kolom staat, en dat maakt de quey trager.
Gewijzigd op 06/12/2011 16:59:36 door Ger van Steenderen
Hoi Ger,
Boedoel je zoals onderstaand? Maar krijg hiermee nu een foutmelding. Kan dit te maken hebben met de sleutel "useraccount.PIDID = product.PIDID" ?
$query = "SELECT productID, categoryID, subcategoryID, productNAME, what, name, remarks, totalMinimum, pricePer, businessprotection, productPRICE, currency, pricePerOne, unitSet, moreInStock, createDATUM, createTIJD, fotoProduct1
FROM product
JOIN useraccount ON name, country WHERE useraccount.PIDID = product.PIDID
ORDER BY $sort LIMIT $offset, $limit ";
Boedoel je zoals onderstaand? Maar krijg hiermee nu een foutmelding. Kan dit te maken hebben met de sleutel "useraccount.PIDID = product.PIDID" ?
$query = "SELECT productID, categoryID, subcategoryID, productNAME, what, name, remarks, totalMinimum, pricePer, businessprotection, productPRICE, currency, pricePerOne, unitSet, moreInStock, createDATUM, createTIJD, fotoProduct1
FROM product
JOIN useraccount ON name, country WHERE useraccount.PIDID = product.PIDID
ORDER BY $sort LIMIT $offset, $limit ";
Michiel: jouw opbouw van de JOIN lijkt niet op het voorbeeld van Ger.
Daarnaast is het handig om als er sprake is van een foutmelding deze ook te plaatsen. ;-)
Daarnaast is het handig om als er sprake is van een foutmelding deze ook te plaatsen. ;-)
Bedoeld Ger dan zoiets?
$query = "SELECT product.PIDID productID, categoryID, subcategoryID, productNAME, what, name, remarks, totalMinimum, pricePer, businessprotection, productPRICE, currency, pricePerOne, unitSet, moreInStock, createDATUM, createTIJD, fotoProduct1,
useraccount.PIDID name, country
FROM product
JOIN useraccount ON useraccount.PIDID = product.PIDID
ORDER BY $sort LIMIT $offset, $limit ";
$query = "SELECT product.PIDID productID, categoryID, subcategoryID, productNAME, what, name, remarks, totalMinimum, pricePer, businessprotection, productPRICE, currency, pricePerOne, unitSet, moreInStock, createDATUM, createTIJD, fotoProduct1,
useraccount.PIDID name, country
FROM product
JOIN useraccount ON useraccount.PIDID = product.PIDID
ORDER BY $sort LIMIT $offset, $limit ";
Hoi Michiel,
Nee dat is niet wat ik bedoel, ik bedoelde meer dat je de kolommen(velden) niet aan een tabel koppelt. Daarom gebruik ik ook aliassen hoef je niet elke keer de volledige tabelnaam in te kloppen. Ik neem tenminste aan dat je gegevens uit meerdere tabellen wilt ophalen.
Kan je ook vertellen welke gegevens op basis van welke criteria in het resultaat wilt hebben.
Nee dat is niet wat ik bedoel, ik bedoelde meer dat je de kolommen(velden) niet aan een tabel koppelt. Daarom gebruik ik ook aliassen hoef je niet elke keer de volledige tabelnaam in te kloppen. Ik neem tenminste aan dat je gegevens uit meerdere tabellen wilt ophalen.
Kan je ook vertellen welke gegevens op basis van welke criteria in het resultaat wilt hebben.
Dus "t1.field1" is een alias voor tabel 1 met kollom 1?
En "table1" t1 is ook een alias?
En "table1" t1 is ook een alias?
yepz.
Helemaal voluit is het:
SELECT t1.field1 AS t1f1 FROM table1 AS t1
Het gebruik van aliassen is niet alleen om typewerk uit te sparen maar ook als je 2x keer moet joinen op dezelfde tabel (denk aan een competitie programma)
Overigens komt de foutmelding door je join, je kan niet in 1 join 2 tabellen koppelen aan de 'hoofdtabel'
Helemaal voluit is het:
SELECT t1.field1 AS t1f1 FROM table1 AS t1
Het gebruik van aliassen is niet alleen om typewerk uit te sparen maar ook als je 2x keer moet joinen op dezelfde tabel (denk aan een competitie programma)
Overigens komt de foutmelding door je join, je kan niet in 1 join 2 tabellen koppelen aan de 'hoofdtabel'
Gewijzigd op 06/12/2011 18:10:34 door Ger van Steenderen
Sorry Ger,
Ik snap het niet!
Bedoel je dat de alias voor tabel useraccount bijvoorbeeld t18 is?
En dat de alias voor de kollom ""name" bijvoorbeeld field4 is?
Als ik letterlijk de query "SELECT t1.field1 AS t1f1 FROM table1 AS t1
" invoer geeft de databas de volgende foutmelding: #1109 - Unknown table 't1' in field list
Ik snap het niet!
Bedoel je dat de alias voor tabel useraccount bijvoorbeeld t18 is?
En dat de alias voor de kollom ""name" bijvoorbeeld field4 is?
Als ik letterlijk de query "SELECT t1.field1 AS t1f1 FROM table1 AS t1
" invoer geeft de databas de volgende foutmelding: #1109 - Unknown table 't1' in field list
Kijk eens naar http://www.w3schools.com/sql/sql_alias.asp en http://www.w3schools.com/sql/sql_join.asp.
Erwin bedank,
Maar waarom wordt het programma/Query hier sneller van?
Maar waarom wordt het programma/Query hier sneller van?
Omdat sql niet alles zelf hoeft uit te zoeken, je geeft hem al veel informatie mee.
Je kunt het effect van een query door EXPLAIN voor je query te zetten. Dan laat die zien wat er gedaan wordt om de gegevens op te halen.
Heb de query aangepast hij werkt maar het is nog steeds traag. Heeft iemand nog een suggestie of doe ik nog iets fout met de bijvoorbeeld de JOIN:
SELECT u.name, u.country, p.productID, p.categoryID, p.subcategoryID, p.productNAME, p.productPRICE, p.createDATUM, p.createTIJD, p.businessprotection, p.VAT, p. VATclass, p.currency, p.totalMinimum, p.pricePer, p.pricePerOne, p.moreInStock, p.remarks, p.what, p.fotoProduct1, p.unitSet
FROM useraccount AS u JOIN product AS p
ON u.PIDID = p.PIDID
Toevoeging op 07/12/2011 11:34:37:
Hoi TJVB,
Met explain krijg ik deze melding:
id select_type table type possible_keys key rows Extra
1 SIMPLE u ALL NULL NULL NULL NULL 3150
1 SIMPLE p ALL NULL NULL NULL NULL 8233 Using where; Using join buffer
SELECT u.name, u.country, p.productID, p.categoryID, p.subcategoryID, p.productNAME, p.productPRICE, p.createDATUM, p.createTIJD, p.businessprotection, p.VAT, p. VATclass, p.currency, p.totalMinimum, p.pricePer, p.pricePerOne, p.moreInStock, p.remarks, p.what, p.fotoProduct1, p.unitSet
FROM useraccount AS u JOIN product AS p
ON u.PIDID = p.PIDID
Toevoeging op 07/12/2011 11:34:37:
Hoi TJVB,
Met explain krijg ik deze melding:
id select_type table type possible_keys key rows Extra
1 SIMPLE u ALL NULL NULL NULL NULL 3150
1 SIMPLE p ALL NULL NULL NULL NULL 8233 Using where; Using join buffer
Ik vermoed dat het niet de query is die traag is, maar je zou hem even kunnen benchmarken:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
//$sql is de query in jouw vorige post
$start = microtime();
$result = mysql_query($sql);
echo microtime() - $start;
?>
//$sql is de query in jouw vorige post
$start = microtime();
$result = mysql_query($sql);
echo microtime() - $start;
?>
@Ger, Die query kan traag zijn op een trage server :p
@Michiel, wat doe je verder met de resultaten?
De explain laat zien dat er geen keys gebruikt worden. Zitten er indexen op je tabellen?
@Michiel, wat doe je verder met de resultaten?
De explain laat zien dat er geen keys gebruikt worden. Zitten er indexen op je tabellen?
Sorry TJVB wat bedoel je met keys? Bedoel je de PIDID welke een gebruiker en zijn advertentie wordt geidentificeerd. Het is een PIDID/sleutel uit de tabellen useraccount en product
Toevoeging op 07/12/2011 12:01:37:
ALs ikm de query draai rechtstreeks op de server en niet via het script doet de query er : Toon Records 0 - 29 ( 8,525 totaal, Query duurde 0.0070 sec) over.
Toevoeging op 07/12/2011 12:01:37:
ALs ikm de query draai rechtstreeks op de server en niet via het script doet de query er : Toon Records 0 - 29 ( 8,525 totaal, Query duurde 0.0070 sec) over.
Door indexes te plaatsen op de juiste kolommen in je tabel kun je het zoeken versnellen.
Voor uitleg zie: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
Maar mijn vraag is vooral wat doe je met het resultaat van je query? Het zou me niet verbazen als de query zelf niet het grootste probleem is (8k records is niet echt heel veel bij een enkele join)
Voor uitleg zie: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
Maar mijn vraag is vooral wat doe je met het resultaat van je query? Het zou me niet verbazen als de query zelf niet het grootste probleem is (8k records is niet echt heel veel bij een enkele join)
Gewijzigd op 07/12/2011 12:05:00 door TJVB tvb




