Toon posts:

[php/mysql]Query optimaliseren

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Heeft iemand enig idee hoe deze queries sneller kunnen?
Nu duurt het namelijk vrij lang om alles uit te voeren en ik vraag me af of er een mogelijkheid is

a) andere queries te gebruiken
of
b) de queries zodanig te combineren

om uiteindelijk het script sneller te krijgen?

dit zijn de queries die worden uitgevoerd:
code:
1
2
3
4
5
6
7
8
9
10
11
$fetch = mysql_query("SELECT artist FROM lyrics WHERE artist LIKE '$artistletter%' AND status = '1' GROUP BY artist LIMIT $start, 20");

$countfetch = mysql_num_rows($fetch);

$totalcountfetch = mysql_num_rows(mysql_query("SELECT id FROM lyrics WHERE artist LIKE '$artistletter%' AND status = '1' GROUP BY artist"));


while($select = mysql_fetch_array($fetch))
{
$countartist = mysql_num_rows(mysql_query("SELECT id FROM lyrics WHERE artist = '$artist' AND status = '1'"));
}

thnx voor jullie reacties ;)

Verwijderd

Ik zie niet wat je met de variabelen met het aantal rijen van plan bent... :?

Verwijderd

Topicstarter
Op dinsdag 04 december 2001 23:12 schreef TheGentleman het volgende:
Ik zie niet wat je met de variabelen met het aantal rijen van plan bent... :?
ik wel ;)
namelijk..ik wil verschillende dingen te weten komen..:


-totaal aantal rijen
-totaal aantal rijen die voldeden aan de searchquery (met beginletter)
-en dan nog $start tot 20 daarvan laten zien

de queries zelf opzich die kloppen wel..die doen alles wat ik wil en volgens mij niks overbodigs..


nu gaat het mij er alleen echt om dat alles sneller gebeurt.

  • Onno
  • Registratie: Juni 1999
  • Niet online
Lees even in de MySQL manual wat COUNT en GROUP BY doen. Daarmee kun je dit heel wat beter oplossen. :)

  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Ik weet niet of je mysql server op een 286 ofzow draait maar zo een query lijkt me dus echt no problemo :)

(tenzij je errug veel rijen in je db hebt zitten, maar dat betwijfel ik)

  • tomato
  • Registratie: November 1999
  • Niet online
Misschien kun je uitleggen wat je wilt? Dan kan iemand er wellicht iets over zeggen...

Maar ik zie zo wel dat een beetje verdiepen in SQL absoluut geen kwaad zou kunnen :)

[edit] Iets te laat, maar dat tweede blijft staan.

Verwijderd

Topicstarter
Op dinsdag 04 december 2001 23:15 schreef stylee het volgende:
Ik weet niet of je mysql server op een 286 ofzow draait maar zo een query lijkt me dus echt no problemo :)

(tenzij je errug veel rijen in je db hebt zitten, maar dat betwijfel ik)
6000 rijen en worden er steeds meer

Verwijderd

Topicstarter
tgaat om de volgende file:

http://www.hotlyrics.net/archive.php3?artistletter=d

voer daar een willekeurige letter in ipv die 'd'


dit wil ik dus.. en dit gaat allemaal wel goed, alleen het duurt dus wat lang ;)

kdenk dat het nu wel duidelijker is (hoop ik :D)

Verwijderd

Zet 's een index op ARTIST en eventueel een op STATUS?

'k Heb vandaag weer 's zo'n situatie meegemaakt waarbij door 2 simpele indexjes te zetten een rapport i.p.v. 80 seconden opeens minder dan 2 seconden kostte.
Was niet met MySQL, maar toch... :)

Verwijderd

Topicstarter
Op dinsdag 04 december 2001 23:33 schreef Afterlife het volgende:
Zet 's een index op ARTIST en eventueel een op STATUS?

'k Heb vandaag weer 's zo'n situatie meegemaakt waarbij door 2 simpele indexjes te zetten een rapport i.p.v. 80 seconden opeens minder dan 2 seconden kostte.
Was niet met MySQL, maar toch... :)
hoe bedoel je dat precies?

een 'index' zetten?

  • Onno
  • Registratie: Juni 1999
  • Niet online
Lees dit eens door. En de rest van de MySQL manual ook gelijk als 't even kan. Dat kan geen kwaad. :)

  • Femme
  • Registratie: Juni 1999
  • Laatst online: 22:41

Femme

Hardwareconnaisseur

Official Jony Ive fan

Als je steeds maar op één letter zoekt kun je er ook een extra kolom bijbouwen met de eerste letter van de artist en daar een index op zetten, of je zet een index met een lengte van 1 character. Doe dan meteen de kolom status erbij aangezien die ook telkens in je where clausule zit: CREATE INDEX artistletter ON lyrics (artist(1), status) .

  • Vuurvlieg
  • Registratie: Januari 2000
  • Laatst online: 05-06 15:09
$fetch = mysql_query("SELECT artist FROM lyrics WHERE artist LIKE '$artistletter%' AND status = '1' GROUP BY artist LIMIT $start, 20");
$countfetch = mysql_num_rows($fetch);
de $countfetch regel lijkt me nogal overbodig aangezien je de query limit tot 20 results, zal hier toch 20 uitkomen.. of zie ik iets over het hoofd..
$totalcountfetch = mysql_num_rows(mysql_query("SELECT id FROM lyrics WHERE artist LIKE '$artistletter%' AND status = '1' GROUP BY artist"));
waarom een "GROUP BY artist" als je toch alleen de rijen telt boeit dat helemaal niet en kost onnodig veel tijd..

misschien is het ook handig om je db design aan te passen als dat mogelijk is.. als ik zo kijk heb je 1 tabel met lyrics en ga je daar de artist uitzoeken, als je nou een tabel artist en een tabel lyrics maakt gaat het vast beter..

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 05 december 2001 ging Onno voor de "subtiele hint" mode:
Lees dit eens door. En de rest van de MySQL manual ook gelijk als 't even kan. Dat kan geen kwaad. :)
:D

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
k thnx voor jullie tips ;)
ik denk dat ik ten eerste voor dat idee over die INDEX ga!!
klinkt wel goed..

dus ik zat te proberen zo'n index te createn..

dmv in phpMyAdmin:

eerst nieuwe collumn aanmaken: indexartist

en daarna:

"CREATE INDEX indexartist ON lyrics (artist(1));"

hiermee zou ik volgens de documentatie de eerste letter van de artist er in moeten krijgen.. maar dat krijg ik niet..
weet iemand wat er mis gaat?

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

als je counts ga doen, kan je die beter aan mysql over laten. dus gebruik
code:
1
SELECT COUNT(id) FROM blalbal

en dan die count uitlezen.
scheelt ook weer wat in tijd..

als aanvulling op de andere oplossingen die al gegeven zijn.. :)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • tomato
  • Registratie: November 1999
  • Niet online
thomaske: als je counts ga doen, kan je die beter aan mysql over laten.
[..]
als aanvulling op de andere oplossingen die al gegeven zijn.. :)
Noemde Onno niet al COUNT? Maar je hebt wel gelijk ;)

Verwijderd

Topicstarter
thnx ;)
dan zal ik COUNT ook gebruiken ipv num_rows maar toch nog ff over die CREATE INDEX want dat gaat denk ik meer tijd schelen..
hoe doe ik dat? (zie vorige post van mij ;))

Verwijderd

Topicstarter
Op woensdag 05 december 2001 21:39 schreef tomato het volgende:

[..]

Noemde Onno niet al COUNT? Maar je hebt wel gelijk ;)
COUNT scheelt trouwens niet veel snelheid

  • tomato
  • Registratie: November 1999
  • Niet online
_Assassinator_: COUNT scheelt trouwens niet veel snelheid
Als je het juist gebruikt kan het tov jouw oplossing ENORM veel schelen vermoed ik. Meer dan een index.

Verwijderd

Topicstarter
hmm in dat geval..
op deze manier gebruik ik COUNT nu:
code:
1
2
3
4
5
6
7
8
9
$fetch = mysql_query("SELECT artist FROM lyrics WHERE artist LIKE '$artistletter%' AND status = '1' GROUP BY artist LIMIT $start, 20");

$totalcountfetch = mysql_query("SELECT COUNT(id) FROM lyrics WHERE artist LIKE '$artistletter%' AND status = '1' GROUP BY artist");


while($select = mysql_fetch_array($fetch))
{
$countartist = mysql_query("SELECT COUNT(id) FROM lyrics WHERE artist = '$artist' AND status = '1'");
}

en hier merk ik dus niet zoveel tijdwinst mee ;)

Verwijderd

Op woensdag 05 december 2001 23:30 schreef _Assassinator_ het volgende:
code:
1
2
3
4
5
..........
while($select = mysql_fetch_array($fetch))
{
$countartist = mysql_query("SELECT COUNT(id) FROM lyrics WHERE artist = '$artist' AND status = '1'");
}
wat is hier het nut van als ik vragen mag?

Verwijderd

Topicstarter
Op woensdag 05 december 2001 23:42 schreef woeitje het volgende:

[..]

wat is hier het nut van als ik vragen mag?
hiermee geeft ie het aantal lyrics aan van de bepaalde artist

  • tomato
  • Registratie: November 1999
  • Niet online
Hmmmm.... :)

Verwijderd

zoiets dus:
code:
1
2
3
$countartist = mysql_query(
"SELECT artist, COUNT(id) as aantal FROM lyrics WHERE artist = '$artist' AND status = '1' GROUP BY artist ORDER BY aantal DESC
");

(alleen staat, 'artist' in je lyrics table? hoop dat het dan een FK is... anders, foei :) )

edit: en die vorige vraag was meer om, waar die while lus op sloeg :)

Verwijderd

Topicstarter
Op woensdag 05 december 2001 23:49 schreef woeitje het volgende:
zoiets dus:
code:
1
2
3
$countartist = mysql_query(
"SELECT artist, COUNT(id) as aantal FROM lyrics WHERE artist = '$artist' AND status = '1' GROUP BY artist ORDER BY aantal DESC
");

(alleen staat, 'artist' in je lyrics table? hoop dat het dan een FK is... anders, foei :) )

edit: en die vorige vraag was meer om, waar die while lus op sloeg :)
'FK'? hmm volgens mij mis ik hier wat :)
eej mensen ik ben geen SQL whizkid ofzo maar ik probeer met de meest logische queries mijn lyrics site te laten werken ;)

Verwijderd

Topicstarter
maar als jullie me wat bij willen leren graag :)
maar have patience :lol:

vind het verder wel fijn dat jullie me helpen ;)
thnx a lot!

  • Mujo
  • Registratie: November 2000
  • Laatst online: 23-08-2021

Mujo

Nee hè?

FK=Foreign Key (Vreemde RedBand Fruitsleutel)

Grab a SQL-manual from somewhere...

Gelieve niet te roken in mijn kantoorkamer!
Ik ben meer verslaafd aan sex, dan jij aan roken, maar je ziet mij toch ook niet neuken op kantoor?


Verwijderd

Topicstarter
Op donderdag 06 december 2001 00:07 schreef Mujo het volgende:
FK=Foreign Key (Vreemde RedBand Fruitsleutel)
lol :)
Op donderdag 06 december 2001 00:07 schreef Mujo het volgende:
Grab a SQL-manual from somewhere...
ik kan helaas niet zulke goede vinden.. maar ik blijf kijken :)
als iemand ondertussen een goede weet?? :)

Verwijderd

Uit de FAQ:
De opmerking welke hier over FK's gemaakt wordt heeft overigens niet veel met SQL te maken hoor, meer met database design (link normaliseren).

Verwijderd

Topicstarter
Op donderdag 06 december 2001 02:48 schreef hezik het volgende:
Uit de FAQ:
[..]

De opmerking welke hier over FK's gemaakt wordt heeft overigens niet veel met SQL te maken hoor, meer met database design (link normaliseren).
eej thnk you ;)

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Ze bedoelen dus dat je eigenljk een tabel met artiesten zou moeten hebben en een tabel met liedjes.
Daar leg je dan een relatie tussen door bij de liedjes bijvoorbeeld een (intern) nummer van de artiest op te nemen.
Dit nummer staat dan dus ook in de tabel van artiesten.
Als je de naam van de artiest verkeerd hebt gespeld hoef je 'm maar een keer te wijzigen en is hij dus ook voor alle liedjes op dezelfde manier gespeld.
====
Nu even voor de ontwerpers onder ons:
Het is trouwens de vraag of er tussen lyric en artist een 1:n relatie ligt. Hoe moet je dan omgaan met eenmalige duetjes? n:m of dan toch maar voor de KISS-methode die hier is gehanteerd.
Pagina: 1