[MySQL]Query optimalisatie

Pagina: 1
Acties:

  • rickmans
  • Registratie: Juli 2001
  • Niet online
Ik heb een klein probleempje met de volgende query:

code:
1
2
3
4
5
6
SELECT r.siteid, r.time, w.title, w.reacts
FROM reacties r, weblog w
WHERE r.area =  2 AND r.siteid = w.id 
GROUP BY r.siteid
ORDER  BY r.siteid DESC
LIMIT 0,10


Op zich is hier niets mee alleen hij neemt mijn inziens teveel tijd in beslag (0,4sec). En waarschijnlijk als de reactie en weblog tables nog verder gaan groeien dan zal die alleen maar trager worden (en dat wil ik dus niet ;)). Wat kan ik er aan doen om hem sneller te laten verlopen?

tablestructuur:
code:
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
28
29
30
31
32
CREATE TABLE weblog (
  id mediumint(7) unsigned NOT NULL auto_increment,
  user mediumint(6) unsigned NOT NULL default '0',
  title tinytext NOT NULL,
  text text NOT NULL,
  time varchar(16) NOT NULL default '',
  reacts smallint(4) unsigned NOT NULL default '0',
  ip varchar(16) NOT NULL default '',
  deleted enum('y','n') NOT NULL default 'n',
  closed enum('y','n') NOT NULL default 'n',
  bron tinytext,
  url text,
  PRIMARY KEY  (id),
  KEY user (user)
) TYPE=MyISAM;

CREATE TABLE reacties (
  id mediumint(7) unsigned NOT NULL auto_increment,
  siteid mediumint(7) unsigned NOT NULL default '0',
  sitearea tinytext NOT NULL,
  area tinyint(4) NOT NULL default '0',
  user mediumint(6) unsigned NOT NULL default '0',
  body text NOT NULL,
  time varchar(16) NOT NULL default '',
  ip varchar(16) NOT NULL default '',
  deleted enum('y','n') NOT NULL default 'y',
  edited tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id),
  KEY siteid (siteid),
  KEY area (area)
) TYPE=MyISAM;

Don't mind Rick


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

drm

f0pc0dert

tsja, het enige wat ik kan bedenken tot zover is nagaan of area vaker 2 is dan de join 'r.siteid = w.id' waar is. Zo niet zou je de WHERE clause om kunnen draaien.
code:
1
WHERE r.siteid = w.id AND r.area =  2

Verder zou je expliciet de indexen aan kunnen geven welke mysql moet gebruiken.

Waarom group je op r.siteid, eigenlijk :? Je gebruikt toch geen aggregated functie?

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


  • rickmans
  • Registratie: Juli 2001
  • Niet online
drm schreef op 29 March 2003 @ 12:19:
tsja, het enige wat ik kan bedenken tot zover is nagaan of area vaker 2 is dan de join 'r.siteid = w.id' waar is. Zo niet zou je de WHERE clause om kunnen draaien.
code:
1
WHERE r.siteid = w.id AND r.area =  2
Area is idd vaker 2, maar ik heb het ook maar even omgedraaid en het ontloopt elkaar ongeveer 0,07sec. (gemiddeld uiteraard)
Verder zou je expliciet de indexen aan kunnen geven welke mysql moet gebruiken.
Ik heb er al een aantal gegeven zoals siteid en ook op een moment op area, maar echt heel veel maakte de extra indices niet uit.
Waarom group je op r.siteid, eigenlijk :? Je gebruikt toch geen aggregated functie?
grotendeels om het een soort reactietracker wordt (de laatste 10 reacties dus) en ik per weblog maar 1 regeltje wil hebben. Vind het zo lomp staan als er tien keer dezelfde weblog staat indien er op één weblog de laatste tien keer is gereageerd. Owja en ook omdat DISTINCT niet deed wat ik wilde :)

Don't mind Rick


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

En een gecombineerde index op r.area en r.siteid ?

  • rickmans
  • Registratie: Juli 2001
  • Niet online
ACM schreef op 29 maart 2003 @ 12:32:
En een gecombineerde index op r.area en r.siteid ?
dat helpt iig wel, er gaat nu ongeveer 0,15 sec af. Dus het is al een hele verbetering in mijn ogen. Zijn er nog meer welkome tips of kan het helaas niet meer sneller.

Even nog gegevens toegevoegen:
de table weblog bevat ongeveer 1000 weblog en de table reacties iets van 6500 reacties :)

Don't mind Rick


  • mocean
  • Registratie: November 2000
  • Laatst online: 15-08 04:26
Het kan aan de LIMIT liggen, die zorgt (bij mij) ook wel eens voor trage selects, omdat MySQL eerst alles moet sorteren, om te zien welke 10 hij terug moet geven.
(Ranzige oplossing) Bouw in je where iets in als 'niet ouder dan 1 dag' of zo (reacties.time > $gisteren)

Koop of verkoop je webshop: ecquisition.com


  • rickmans
  • Registratie: Juli 2001
  • Niet online
mocean schreef op 29 March 2003 @ 12:54:
Het kan aan de LIMIT liggen, die zorgt (bij mij) ook wel eens voor trage selects, omdat MySQL eerst alles moet sorteren, om te zien welke 10 hij terug moet geven.
(Ranzige oplossing) Bouw in je where iets in als 'niet ouder dan 1 dag' of zo (reacties.time > $gisteren)
mwah qua ranzigheid valt het toch best mee? en opzich lijkt het me inderdaad niet een heel gek idee. Even testen :)

Don't mind Rick


  • mocean
  • Registratie: November 2000
  • Laatst online: 15-08 04:26
rickmans schreef op 29 March 2003 @ 12:56:
[...]

mwah qua ranzigheid valt het toch best mee? en opzich lijkt het me inderdaad niet een heel gek idee. Even testen :)
Het is een beetje ranzig vind ik, want als je de termijn instelt als 1 dag, en je hebt een dag geen reacties krijg je geen top 10 meer, daar kan je wel wat op verzinnen met een count, om die '1 dag' limiet aan te passen. Maar met een drukke site zal het wel loslopen

Koop of verkoop je webshop: ecquisition.com


  • rickmans
  • Registratie: Juli 2001
  • Niet online
mocean schreef op 29 maart 2003 @ 12:59:
[...]

Het is een beetje ranzig vind ik, want als je de termijn instelt als 1 dag, en je hebt een dag geen reacties krijg je geen top 10 meer, daar kan je wel wat op verzinnen met een count, om die '1 dag' limiet aan te passen. Maar met een drukke site zal het wel loslopen
normaal gesproken zijn er elke dag wel 10 reacties, maar ik zet de scope dan wel iets ruimer op 3 of 4 dagen :), maar goed nog bezig met testen

Don't mind Rick


  • rickmans
  • Registratie: Juli 2001
  • Niet online
Mjah dat scheelt weer 0,15sec ongeveer. Nou met het restant kan ik redelijk goed leven moet ik zeggen :7

Bedankt iedereen

Don't mind Rick

Pagina: 1