2011-01-14 1 views
4

Ist es besser, 100 SQL-Abfragen mit einer WHERE-Klausel auszuführen, die eine Bedingung hat, oder eine Abfrage mit einer WHERE-Klausel, die 100 Bedingungen hat? Wenn ich beispielsweise prüfen möchte, ob bereits 100 Benutzernamen in einer Tabelle vorhanden sind, wäre es besser, 100 Abfragen zu durchlaufen oder eine komplexe Abfrage durchzuführen, die jeweils nach 100 Benutzernamen sucht.Ist es besser, 100 SQL-Abfragen mit einer WHERE-Klausel auszuführen, die eine Bedingung hat, oder eine Abfrage mit einer WHERE-Klausel, die 100 Bedingungen hat?

Antwort

11

Ich habe keine Tests gemacht, aber ich würde eine große Abfrage bevorzugen. Bei 100 Abfragen müssen Sie eine Verbindung zur Datenbank herstellen, die Abfragezeichenfolge senden und die Antworten/Ergebnisse 100 Mal verarbeiten. Mit einer einzigen Abfrage senden Sie eine (größere) Abfrage und erhalten eine Antwort zurück. Ich kenne nicht die genauen Kosten von 100 Kontextwechsel, aber es ist wahrscheinlich nicht unbedeutend. Die Datenbank wird wahrscheinlich mit einer großen Abfrage die gleiche Menge an Arbeit erledigen müssen. Und wenn alles, was Sie überprüft sind 1 Benutzername vs. 100 Benutzername, es ist nicht eine sehr komplexe Abfrage, es ist mehr wie

select * 
from users 
where username in ('value1',...,'value100'); 
+2

Denken Sie daran, SQL Injection zu vermeiden – SLaks

+0

Vielen Dank. Das wusste ich nicht! – Matty

+1

1 Abfrage ist deutlich schneller als 100s (mehrere Größenordnungen), basierend auf den Kosten für die Verbindung, SQL-Kompilierung, SQL-Auswertung, Datei-Paging, Index-Scan, Datenübertragung, etc. –

4

Je weniger Anfragen, desto besser.

+0

Nicht wahr im allgemeinen Sinne. 100 Primärschlüsselsuchen sind in der Regel wesentlich schneller als eine einzelne kartesische Verknüpfung in einer Tabelle mit 1 Million Zeilen. Gehen Sie für effizientere Abfragen im Allgemeinen, nicht unbedingt weniger (aber effizienter ** und ** weniger Abfragen ist am besten). – ircmaxell

+0

Wenn alles andere gleich ist, ist es in weniger Abfragen besser. Aber vergessen Sie nicht, eine große Abfrage mit EXPLAIN zu überprüfen, um sicherzustellen, dass sie nicht wirklich ineffizient arbeitet, was Sie nicht erwartet haben. In diesem Beispiel stelle ich mir jedoch vor, dass Sie nur einen WHERE-Benutzernamen IN ... benötigen. – thomasrutter

2

Ist es einfacher, wenn Sie @table erstellen und der @table 100 Namen hinzufügen.

Filtern Sie die Abfrage von IN-Anweisung.

3

Weniger ist mehr. Führen Sie in diesem Fall die wenigsten Abfragen durch, um Ihre Ergebnisse zu erzielen.

3

SQL ist basiert basiert. Es ist besser, eine Abfrage mit einer Klausel mit 100 Bedingungen auszuführen. Denken Sie daran, dass jede Abfrage eine separate, implizite Transaktion darstellt. Daher benötigt sie mehr Overhead, um hundert einfache Abfragen auszuführen, im Gegensatz zu einer komplexen Abfrage (aus Sicht der Verarbeitung und Bandbreite). Davon abgesehen kann die Ausführung der 100 Abfragen aus einer Implementierungsperspektive einfacher sein, unabhängig von der Leistung.

2

Ich bin bereit zu wetten, dass eine große Abfrage schneller ist ...

... aber eher als mein Bauchgefühl glaubt, es ist ein einfacher Weg, um es zu beweisen. Erstelle einen einfachen Leistungsprototyp und sehe.

2

Die kurze Antwort ist, dass es abhängt. Es hängt von den Daten in den Tabellen ab, von den Typen der Where-Klauseln, gegen die Sie arbeiten (Primärschlüssel gegen Mehrfachschlüssel usw.), von der Größe der Ergebnismengen usw. In manchen Fällen wird eine Abfrage viel schneller sein andere werden viele sein.

Im Allgemeinen gilt, je weniger Abfragen ausgeführt werden, desto besser. Allerdings sind 100 hocheffiziente Abfragen (zum Beispiel Primärschlüssel-Lookups) weitaus besser als 1 sehr ineffiziente Abfrage.

Soweit Ihr spezifisches Problem, wenn die 100 Abfragen identisch sind, kombinieren Sie sie zu einem. Wenn sie verwandt sind (z. B. Autoren für 100 Posts abrufen), kombinieren Sie sie zu einem. Wenn sie nichts miteinander zu tun haben, versuchen Sie nicht, sie zu kombinieren (da dies die Lesbarkeit und Wartbarkeit beeinträchtigt).

2

dies ziemlich schnell, aber nicht sehr schön: P

drop table if exists users; 
create table users 
(
user_id int unsigned not null auto_increment primary key, 
username varbinary(32) unique not null 
) 
engine=innodb; 

drop procedure if exists username_check; 
delimiter # 

create procedure username_check 
(
in p_username_csv varchar(65535) 
) 
proc_main:begin 

declare v_token varchar(255); 
declare v_done tinyint unsigned default 0; 
declare v_idx int unsigned default 1; 

    if p_username_csv is null or length(p_username_csv) <= 0 then 
     leave proc_main; 
    end if; 

    -- split the string into tokens and put into an in-memory table... 

    create temporary table tmp(
     username varbinary(32), 
     username_exists tinyint unsigned default 0, 
    key (username) 
    )engine = memory; 

    while not v_done do 
    set v_token = trim(substring(p_username_csv, v_idx, 
     if(locate(',', p_username_csv, v_idx) > 0, 
     locate(',', p_username_csv, v_idx) - v_idx, length(p_username_csv)))); 

     if length(v_token) > 0 then 
     set v_idx = v_idx + length(v_token) + 1; 
     insert into tmp (username) values(v_token); 
     else 
     set v_done = 1; 
     end if; 
    end while; 

    -- flag any that exist 

    update tmp t inner join users u on t.username = u.username 
     set t.username_exists = 1; 

    select * from tmp order by username; 

    drop temporary table if exists tmp; 

end proc_main # 

delimiter ; 

select count(*) from users; 
+----------+ 
| count(*) | 
+----------+ 
| 1000000 | 
+----------+ 
1 row in set (0.22 sec) 


call username_check('user1,user2,user3... user250'); 

250 rows in set (0.01 sec) 
3

IMHO es ist persönliche Präferenz, wenn Sie einige mega große verrückte Sachen tun, die sich über ein paar Tische usw. und auf einer großen Menge an Daten umfasst, Die Geschwindigkeitsgewinne werden nicht groß sein.

Wenn Sie sich entscheiden, alles durch Abfragen zu tun, stellen Sie sicher, dass Sie Ihre Schlüssel und Indizes gut, andernfalls für jede Abfrage muss in der ganzen Tabelle lesen, um zu finden, was es braucht.

Sie werden einige große Gewinne in der Geschwindigkeit erhalten, wenn Sie Ihre Indizes gut einstellen.

+0

Richtig indizieren ... Ich habe diese Lektion auf die harte Tour vor einiger Zeit gelernt! – Matty

Verwandte Themen