[MySQL] Optimaliseren query

Pagina: 1
Acties:

  • FrankvR
  • Registratie: Mei 2004
  • Laatst online: 01-01-2025
Hallo mensen, ik heb een query die wel erg lang duurt, en vroeg me af ik het misschien beter kon doen.

De query is:
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
33
34
35
36
37
SELECT i.id, i.ip,  CONCAT("<a href='",ref.referrer,"'>",ref.referrer,"</a>") as ref, CASE ref.referrer WHEN 'Google' THEN google.zoekwoorden WHEN 'MSN' THEN msn.zoekwoorden ELSE '' END AS zoekwoorden, res.resolution, col.color, os.os, brow.browser, bwver.version, p.soortpagina, 

CASE p.soortpagina  
 WHEN 'vraag' 
  THEN a.vraagdef
 WHEN 'rubrieken' 
  THEN c.naam
 WHEN 'zoeken'
  THEN z.query
 WHEN 'bedankt_vraag'
  THEN v.vraag
 WHEN 'panel'
  THEN ad.username
 WHEN 'archief'
  THEN p.idvandepagina
END as specifiek,

DATE_FORMAT(h.tijd,'%d-%m-%Y %H:%i') as tijd

FROM stats_info i
LEFT JOIN stats_browser brow ON i.browser = brow.id
LEFT JOIN stats_referrer ref ON ref.id = i.referrer
LEFT JOIN stats_resolution res ON res.id = i.resolution
LEFT JOIN stats_os os ON os.id = i.os
LEFT JOIN stats_browser_version bwver ON bwver.id = i.version
LEFT JOIN stats_color col ON col.id = i.color
LEFT JOIN stats_google_zoekwoorden google ON google.stats_id = i.id
LEFT JOIN stats_msn_zoekwoorden msn ON msn.stats_id = i.id
LEFT JOIN stats_hits h ON h.id = i.eerste_hit
LEFT JOIN stats_pagina p ON p.id = h.pagina
LEFT JOIN antwoorden a ON a.id = p.idvandepagina
LEFT JOIN categories c ON c.id = p.idvandepagina
LEFT JOIN stats_zoeken z ON h.id = z.hitid
LEFT JOIN vraagstellers vs ON vs.hitid = (h.id - 1)
LEFT JOIN vragen v ON vs.id = v.id
LEFT JOIN admins ad ON ad.id = p.idvandepagina
ORDER BY i.id DESC LIMIT 0,30


Als ik EXPLAIN toepas krijg ik het volgende:

tabletypepossible_keyskeykey_lenrefrowsExtra
iALL7109Using temporary; Using filesort
broweq_refPRIMARYPRIMARY4i.browser1
refeq_refPRIMARYPRIMARY4i.referrer1
reseq_refPRIMARYPRIMARY4i.resolution1
oseq_refPRIMARYPRIMARY4i.OS1
bwvereq_refPRIMARYPRIMARY4i.version1
coleq_refPRIMARYPRIMARY4i.color1
googleALL2232
msnALL78
heq_refPRIMARYPRIMARY4i.eerste_hit1
peq_refPRIMARYPRIMARY4h.pagina1
aeq_refPRIMARYPRIMARY4p.idvandepagina1
ceq_refPRIMARYPRIMARY4p.idvandepagina1
zALL1045
vsALL95
veq_refPRIMARYPRIMARY4vs.id1
adeq_refPRIMARYPRIMARY4p.idvandepagina1


De query doet veel join's, maar dat komt door het normaliseren van de database. Is het normaal dat zo'n query er 23 seconden over doet?

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ik denk niet dat je goed genormaliseerd heb.
google en msn zoekwoorden zijn allebei gewoon zoekwoordenen zou ik dus in 1 tabel zetten.
verder snap ik niet precies wat die z en vs tabellen doen .. waar dienen die voor? want die maken het zonder index ook retetraag

[ Voor 8% gewijzigd door marty op 29-03-2005 15:05 ]


  • FrankvR
  • Registratie: Mei 2004
  • Laatst online: 01-01-2025
Ah, ik was gewoon vergeten om in die tabellen die je beschrijft primary keys aan te geven.
Nu is dezelfde query gebeurt in 0,02 seconden. Handig die EXPLAIN!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

FrankvR schreef op dinsdag 29 maart 2005 @ 15:14:
Ah, ik was gewoon vergeten om in die tabellen die je beschrijft primary keys aan te geven.
Nu is dezelfde query gebeurt in 0,02 seconden. Handig die EXPLAIN!
Waarom had je daar dan zelf niet naar gekeken? Had je weer een topic plaatsen en wachten op uitleg erover bespaard ;)