2009-08-13 3 views
1

mit PHP und MySQLWie optimiert man MySQL Abfrage, wenn ich zu viele OR-Operatoren in meiner Abfrage habe?

Ich habe eine Reihe von Facebook-Benutzer-IDs von Facebook gegriffen.

Jetzt möchte ich den entsprechenden Benutzernamen in meiner Anwendung für dieses Array finden.

Offensichtlich in meiner Anwendung enthält die Benutzertabelle eindeutigen Benutzernamen und eindeutige fb_uid Werte.

mein rudimentäres Verständnis oof Programmierung führte mich zu 2 Möglichkeiten:

1) eine Schleife verwenden und durch die Anordnung von fb_uid laufen und den Benutzernamen einer nach dem anderen zu finden.

OR

2) ein Monster Abfrage wie select distinct (Benutzername erstellen) von den Benutzern wo fb_uid = Wert1 OR fb_uid = Wert2 ...

so gibt es einen besseren Weg?

Vielen Dank.

Antwort

1

Wenn Ihre Liste von fb_uids groß ist (sagen wir, mehr als 100 oder 500 r 1000 hundert ids), würde ich nicht gehen mit dem "oder" Weg: zu viele "oder" so wird die DB verletzen, denke ich.

Aber tut eine Abfrage pro-ID ist auch nicht wirklich gut ...


Was ist also eine Mischung aus diesen beiden Ideen? Eine Abfrage pro, sagen wir, 50 oder 100 fb_uids?

Und, anstatt Lose oder OR zu verwenden, können Sie mit IN gehen; ein bisschen wie folgt aus:

select distinct(username) from users where fb_uid IN (id1, id2, id3, ...) 

nicht sicher, dass es etwas für die DB ändern wird, aber zumindest sieht es besser ^^

Nur, was ist, sollten Sie nicht in der zu viele IDs verwenden IM ; Also, ein paar Abfragen, mit zwischen 50 und 500 IDs jedes Mal könnte der richtige Weg sein.


Und Sie ein bisschen weiter helfen, könnten Sie einen Blick auf array_slice nehmen müssen, „Scheiben“ des fb_uids Array zu extrahiert ...

+0

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html # function_in - Nach diesem Link ist die maximale Anzahl von Werten für IN in MySQL nur durch die max_packet_size begrenzt. Also ... wie viele Werte du dort festhältst, kann wahrscheinlich ziemlich groß sein, aber Tests sind erforderlich, um _how_ large zu finden. Ansonsten mag ich deine Antwort: +1. – nilamo

+0

Ich vermutete, dass dies Auswirkungen auf die Performance haben könnte - das ist eher der Grund, warum ich nicht zu viele Werte in das IN() gesetzt habe; Allerdings muss ich zugeben, dass ich diesbezüglich keine MySQL-Benchmarks gemacht habe ^^ –

0

Es gibt eine andere MySQL-Funktion: MATCH AGAINST

SELECT * FROM customer WHERE status = 1 AND MATCH (person, city, company, zipcode, tags) AGAINST ('".$searchstring."' IN BOOLEAN MODE) 

Ihre Eingabezeichenfolge wird in verschiedenen Spalten gesucht.

Vielleicht können Sie Ihre SQL-Anweisung überdenken, wenn Sie diese Funktion nicht kannten.