Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL Subselect, beschleunigen wie (https://www.delphipraxis.net/130320-mysql-subselect-beschleunigen-wie.html)

alice 6. Mär 2009 12:29

Datenbank: MySql • Version: 5.0.xx • Zugriff über: PhP

MySQL Subselect, beschleunigen wie
 
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='mem' and 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

mkinzler 6. Mär 2009 12:33

Re: MySQL Subselect, beschleunigen wie
 
Versuch es mal in statt = oder mit einem Join statt Subselect

alice 6. Mär 2009 12:52

Re: MySQL Subselect, beschleunigen wie
 
hi,

Zitat:

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?

omata 6. Mär 2009 20:55

Re: MySQL Subselect, beschleunigen wie
 
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?

alice 7. Mär 2009 07:24

Re: MySQL Subselect, beschleunigen wie
 
hi,

Zitat:

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

zack0r 7. Mär 2009 16:09

Re: MySQL Subselect, beschleunigen wie
 
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 = 'mem' AND 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

alice 7. Mär 2009 16:53

Re: MySQL Subselect, beschleunigen wie
 
hi,

Zitat:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:06 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