query traag
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.
Wat bedoel je precies met de indexes in de database? (bijvoorbeeld aantal kolommen of de waardes van kolommen zoals varchar etc?
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
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 ";
Daarnaast is het handig om als er sprake is van een foutmelding deze ook te plaatsen. ;-)
$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 ";
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.
En "table1" t1 is ook een alias?
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
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
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.
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
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;
?>
@Michiel, wat doe je verder met de resultaten?
De explain laat zien dat er geen keys gebruikt worden. Zitten er indexen op je tabellen?
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.
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