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)