AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken MySQL Subselect, beschleunigen wie

MySQL Subselect, beschleunigen wie

Offene Frage von "alice"
Ein Thema von alice · begonnen am 6. Mär 2009 · letzter Beitrag vom 7. Mär 2009
Antwort Antwort
alice

Registriert seit: 13. Mär 2005
7 Beiträge
 
#1

MySQL Subselect, beschleunigen wie

  Alt 6. Mär 2009, 13:29
Datenbank: MySql • Version: 5.0.xx • Zugriff über: PhP
hi,

dieses select statment:

SQL-Code:
SELECT
m.ben_user,m.ben_img,m.ben_resu,m.ben_typ,m.mem_typ from tab2 m
where
m.ben_resu =
(
SELECT
MAX(i.ben_resu) FROM tab2 i
WHERE
m.ben_user = i.ben_user and i.ben_typ='memand i.mem_typ='d3
)
ORDER BY m.ben_resu desc
lasse ich laufen was auch das richtige ergebniss bringt. jedoch ist die performance eher schlecht.

umfeld: mysql v5.0.xx

wie könnte ich das beschleunigen?

gruss

alice
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: MySQL Subselect, beschleunigen wie

  Alt 6. Mär 2009, 13:33
Versuch es mal in statt = oder mit einem Join statt Subselect
Markus Kinzler
  Mit Zitat antworten Zitat
alice

Registriert seit: 13. Mär 2005
7 Beiträge
 
#3

Re: MySQL Subselect, beschleunigen wie

  Alt 6. Mär 2009, 13:52
hi,

Zitat von mkinzler:
Versuch es mal in statt = oder mit einem Join statt Subselect
das verbindene = zu IN bringt keinen nennenswerten unterschied.

wie müsste das ganze per join aussehen?
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: MySQL Subselect, beschleunigen wie

  Alt 6. Mär 2009, 21:55
Deine Abfrage ist soweit ok.
Den IN-Operator sollte man niemals verwenden, wenn eine zweite Verknüfung zwischen den Abfragen bestehe, da geht die Performance dann richtig in den Keller.

Unveränderte Abfrage, nur mal ohne Augenkrebs...
SQL-Code:
SELECT ben_user, ben_img, ben_resu, ben_typ, mem_typ
FROM tab2 m
WHERE ben_resu = (SELECT MAX(ben_resu)
                  FROM tab2
                  WHERE ben_user = m.ben_user
                    AND ben_typ = 'mem
                    AND mem_typ = 'd3')
ORDER BY ben_resu DESC
Wie sieht der Aufbau deiner Tabelle aus? Primärschlüssel vorhanden? Eventuell einen Index angelegt?
  Mit Zitat antworten Zitat
alice

Registriert seit: 13. Mär 2005
7 Beiträge
 
#5

Re: MySQL Subselect, beschleunigen wie

  Alt 7. Mär 2009, 08:24
hi,

Zitat von omata:
Wie sieht der Aufbau deiner Tabelle aus? Primärschlüssel vorhanden? Eventuell einen Index angelegt?
die indexe wie folgt:

Code:
  PRIMARY KEY (`ID`),
  KEY `ix_composite1` (`BEN_RESU`,`BEN_USER`,`BEN_TYP`,`MEM_TYP`),
  KEY `ix_composite2` (`BEN_USER`,`BEN_TYP`,`MEM_TYP`),
  KEY `ix_composite3` (`BEN_USER`,`BEN_RESU`,`BEN_TYP`),
  KEY `ix_composite4` (`BEN_RESU`,`BEN_USER`,`BEN_TYP`)
wenn ich mir das per Explain ansehe:

Code:
select_type;table;type;possible_keys;key;key_len;ref;rows;Extra
PRIMARY;m;ALL;null;null;null;null;1177,000000;Using where; Using filesort
DEPENDENT SUBQUERY;tab2;ref;ix_composite2,ix_composite3;ix_composite2;207;usr_web30_1.m.BEN_USER,const,const;2,000000;Using where
ich bin mir nicht sicher ob so optimal ist?
wie ist dieser output via explain zu verstehen?
wäre ein join schneller? und wie müsse diese abfrage als join aussehen?

thx
  Mit Zitat antworten Zitat
zack0r

Registriert seit: 5. Jan 2005
Ort: Rosenheim
25 Beiträge
 
#6

Re: MySQL Subselect, beschleunigen wie

  Alt 7. Mär 2009, 17:09
Hi
Ohne Gewähr...vielleicht mit einem Group-By? Wenn ich deine Anfrage richtig verstehe kommt doch nur ein Datensatz als Ergebnis raus oder? Weil du ja das Maxiale Element von ben_resu abfragst... wofür ist dann das Order-By?

Also so würdest du garkeinen join brauchen:

SQL-Code:
SELECT ben_user, ben_img, ben_resu, ben_typ, mem_typ
FROM tab2
WHERE ben_typ = 'memAND mem_typ = 'd3'
GROUP BY ben_resu
HAVING MAX(ben_resu)
[ORDER BY ben_resu DESC]
Sollte schneller sein, oder ich hab deine Abfrage nicht richtig verstanden. Vielleicht zeigst du uns mal die Struktur der Tabelle?

Gruß zack0r
  Mit Zitat antworten Zitat
alice

Registriert seit: 13. Mär 2005
7 Beiträge
 
#7

Re: MySQL Subselect, beschleunigen wie

  Alt 7. Mär 2009, 17:53
hi,

Zitat von zack0r:
Ohne Gewähr...vielleicht mit einem Group-By? Wenn ich deine Anfrage richtig verstehe kommt doch nur ein Datensatz als Ergebnis raus oder? Weil du ja das Maxiale Element von ben_resu abfragst... wofür ist dann das Order-By?

Sollte schneller sein, oder ich hab deine Abfrage nicht richtig verstanden. Vielleicht zeigst du uns mal die Struktur der Tabelle?
das ist schneller, jedoch hast du das "WHERE ben_user = m.ben_user" übersehen.
damit hole ich mir nur den max wert (ben_resu) vom jeweiligen ben_user in die query-menge.

deshalb auch das order by.
im erg. sind alle ben_user mit dem jeweiligen max wert (ben_resu), also einem satz pro ben_user,
die auf das kriterium " ben_typ = 'mem' AND mem_typ = 'd3' " passen.

gruss
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz