Geschwindigkeitsproblem beim Ausschliessen von Datensätzen durch Abfrage in mehreren Tabellen
Geschwindigkeitsproblem beim Ausschliessen von Datensätzen durch Abfrage in mehreren Tabellen
am 08.12.2006 20:22:57 von Christian Oeing
Hallo Leute,
Ich habe ein kleines Problem mit der Geschwindigkeit bei einem
Browsergame. Und zwar habe ich die entscheidene Stelle schon
festgestellt, jedoch fällt mir keine Möglichkeit ein es schneller zu
machen:
SELECT *, b.broadcastid AS id
FROM broadcasts b
LEFT JOIN genres g ON g.genreid =3D b.genreid
WHERE b.broadcastid NOT IN (
SELECT bc.broadcastid FROM broadcasts2communities bc
WHERE bc.communityid =3D 2 UNION
SELECT ba.broadcastid FROM broadcasts2auctions ba
WHERE ba.communityid =3D 2 UNION
SELECT bd.broadcastid FROM broadcasts2dealers bd
WHERE bd.communityid =3D 2 UNION
SELECT bi.broadcastid FROM broadcastignorelists bi
WHERE bi.communityid =3D 2 UNION
SELECT bu.broadcastid FROM broadcasts2users bu
WHERE bu.gameid =3D '806' )
AND b.deprecated =3D 0
AND b.gameid IS NULL
ORDER BY title LIMIT 0, 20
Ich habe zwar nicht viel Hoffnung, aber vielleicht hat ja tatsächlich
jemand von euch eine Idee wie es schneller geht.
Gruß
Christian
Re: Geschwindigkeitsproblem beim Ausschliessen von Datensätzen durch Abfrage in mehreren Tabellen
am 08.12.2006 20:48:24 von Johannes Vogel
Hi Christian
Christian Oeing wrote:
> Ich habe ein kleines Problem mit der Geschwindigkeit bei einem
> Browsergame. Und zwar habe ich die entscheidene Stelle schon
> festgestellt, jedoch fällt mir keine Möglichkeit ein es schneller zu
> machen:
> SELECT *, b.broadcastid AS id
> FROM broadcasts b
> LEFT JOIN genres g ON g.genreid = b.genreid
> WHERE b.broadcastid NOT IN (
> SELECT bc.broadcastid FROM broadcasts2communities bc
> WHERE bc.communityid = 2 UNION
> SELECT ba.broadcastid FROM broadcasts2auctions ba
> WHERE ba.communityid = 2 UNION
> SELECT bd.broadcastid FROM broadcasts2dealers bd
> WHERE bd.communityid = 2 UNION
> SELECT bi.broadcastid FROM broadcastignorelists bi
> WHERE bi.communityid = 2 UNION
> SELECT bu.broadcastid FROM broadcasts2users bu
> WHERE bu.gameid = '806' )
> AND b.deprecated = 0
> AND b.gameid IS NULL
> ORDER BY title LIMIT 0, 20
> Ich habe zwar nicht viel Hoffnung, aber vielleicht hat ja tatsächlich
> jemand von euch eine Idee wie es schneller geht.
Du willst dein Tabledesign flicken und
16.14. Warum soll ich nicht SELECT * schreiben?
http://www.php-faq.de/q/q-sql-select.html
HTH, Johannes
Re: Geschwindigkeitsproblem beim Ausschliessen von Datensätzen durch Abfrage in mehreren Tabellen
am 08.12.2006 22:14:07 von Oliver Dietz
Hallo Christian,
> SELECT *, b.broadcastid AS id
> FROM broadcasts b
> LEFT JOIN genres g ON g.genreid = b.genreid
> WHERE b.broadcastid NOT IN (
> SELECT bc.broadcastid FROM broadcasts2communities bc
> WHERE bc.communityid = 2 UNION
> SELECT ba.broadcastid FROM broadcasts2auctions ba
> WHERE ba.communityid = 2 UNION
> SELECT bd.broadcastid FROM broadcasts2dealers bd
> WHERE bd.communityid = 2 UNION
> SELECT bi.broadcastid FROM broadcastignorelists bi
> WHERE bi.communityid = 2 UNION
> SELECT bu.broadcastid FROM broadcasts2users bu
> WHERE bu.gameid = '806' )
> AND b.deprecated = 0
> AND b.gameid IS NULL
> ORDER BY title LIMIT 0, 20
ohne die vorhandenen Indizes und die Anzahl der Datensätze sowie deren
Inhalt zu kennen, schwer zu sagen.
Versuch mal statt
---
SELECT bc.broadcastid FROM broadcasts2communities bc WHERE bc.communityid =
2
---
Einen Index auf (cummunityid, broadcastid) zu definieren und zu dem SELECT
ein DISTINCT zu setzen.
Also:
---
ALTER TABLE `broadcasts2communities` ADD INDEX ( `communityid` ,
`broadcastid` ) ;
SELECT DISTINCT bc.broadcastid FROM broadcasts2communities bc WHERE
bc.communityid = 2 UNION DISTINCT ...
---
Für die anderen Tabellen in dem UNION the same ...
Und du könntest es noch mit einem Index auf broadcasts versuchen:
---
ALTER TABLE `broadcasts` ADD INDEX ( `deprecated` , `gameid`, `genreid`) ;
---
Aus welcher Tabelle kommt title?
Grüße,
Oliver
Re: Geschwindigkeitsproblem beim Ausschliessen von Datensätzendurch Abfrage in mehreren Tabellen
am 09.12.2006 09:37:42 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Geschwindigkeitsproblem beim Ausschliessen von Datensätzendurch Abfrage in mehreren Tabellen
am 09.12.2006 11:08:51 von Thomas Rachel
Andreas Kretschmer wrote:
> Frag doch mal Dein EXPLAIN. Und frag Deinen Server, welche Version. Und
> frag Deine Tabellen nach Indexen. Und bedenke, daà abgehangene
> Versionen wohl nur ein Index pro SELECT nutzen können.
s/pro SELECT/pro in einem SELECT verwendeter Tabelle/
Thomas
--
Das ist keine Signatur, es handelt sich nur um eine Signatur-Attrappe.
Re: Geschwindigkeitsproblem beim Ausschliessen von Datensätzendurch Abfrage in mehreren Tabellen
am 09.12.2006 11:26:23 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)