Toon posts:

[MySQL] Query optimalisatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met de volgende query:

code:
1
2
3
4
5
6
SELECT c.category_name, e.education_name,
CONCAT("S", c.category_id) AS category_url
FROM c_category c
LEFT OUTER JOIN c_education e
ON e.education_id = c.education_id
ORDER BY e.education_name ASC, c.category_name ASC


Deze query is rechtstreeks uit de mysql logs getrokken met de vermelding dat deze geen indices gebruikt. Zie hier de EXPLAIN uitvoer:

code:
1
2
3
d    select_type     table       type    possible_keys       key     key_len     ref     rows    Extra
1   SIMPLE  c   ALL     NULL    NULL    NULL    NULL    3   Using temporary; Using filesort
1   SIMPLE  e   ref     get_education   get_education   3   elo.c.education_id  1   Using index


Ik heb voor zo ver ik weet alles al geprobeerd. Echter verdomd mysql het om deze query m.b.v. een index uit te voeren. Hij blijft de query uitvoeren d.m.v. een filesort en een temporary. Toch zou ik deze query graag met een query uitvoeren.

Ook deze query levert dezelfde problemen op:

code:
1
2
3
4
5
6
SELECT c.course_name, e.education_name,
CONCAT("S", c.course_id) AS course_url
FROM c_course c, c_category c2      
LEFT OUTER JOIN c_education e
ON e.education_id = c2.education_id
WHERE c2.category_id = c.category_id


En weer de uitvoer van de EXPLAIN:

code:
1
2
3
4
 id      select_type     table       type    possible_keys       key     key_len     ref     rows    Extra
1   SIMPLE  c   ALL     category_id     NULL    NULL    NULL    2    
1   SIMPLE  c2  eq_ref  PRIMARY     PRIMARY     4   elo.c.category_id   1    
1   SIMPLE  e   ref     get_education   get_education   3   elo.c2.education_id     1   Using index


Als iemand een idee heeft waarom deze queries niet een een index willen werken dan hoor ik het graag. De index licht op de velden in ON conditie bij de betrokken tabellen. De tabellen bevatten allen momenteel slechts 4 tot 6 rijen. Kan het zijn dat mysql daarom de query niet met een index uitvoert?

B.v.d.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:00
Het is idd omdat je tabellen vrijwel geen gegevens bevatten dat er geen indexen gebruikt worden; en dat omdat het DBMS er van uit gaat dat een table-scan in dit geval sneller gaat dan het gebruiken van een index. (En dat zal ook wel zo zijn).

https://fgheysels.github.io/


Verwijderd

Topicstarter
Hrmm.. daar was ik al bang voor :(

Is er bij MySQL ook een optie om zonder allerlei rotzooi data in te schieten om te zien of mysql in het geval van mijn queries ook de juiste indices gebruikt?

Ik heb weinig behoefte om allerlei rotzooi data te genereren om dit vervolgens in te schieten en dan nogmaals te testen :(

In de toekomst gaan de tabellen namelijk *Wel* meer informatie bevatten ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:00
Een andere reden waarom een index niet kan gebruikt worden, is omdat de index niet uniek genoeg is.
In de toekomst gaan de tabellen namelijk *Wel* meer informatie bevatten
Da's toch helemaal geen probleem ? :)
Een DBMS is in staat om te bepalen of hij nu beter wel of niet indexen gebruikt. Als je tabel op een gegeven moment meer informatie bevat, dan zal MySQL wel bepalen dat hij nu wel een index gaat gebruiken.

https://fgheysels.github.io/


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 22-02 20:26
Verwijderd schreef op maandag 10 april 2006 @ 14:16:
Ik heb weinig behoefte om allerlei rotzooi data te genereren om dit vervolgens in te schieten en dan nogmaals te testen :(
Lijkt mij toch wel de manier om er achter te komen, of niet? Wat houdt je tegen om het juist niet te willen? Maak een kopie van je database structuur, maak een test db aan en vul deze met erg veel data. En voer daarna nogmaals je explain queries uit. Ik zie het probleem niet zo.