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
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');
Je weniger Anfragen, desto besser.
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
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
Ist es einfacher, wenn Sie @table erstellen und der @table 100 Namen hinzufügen.
Filtern Sie die Abfrage von IN-Anweisung.
Weniger ist mehr. Führen Sie in diesem Fall die wenigsten Abfragen durch, um Ihre Ergebnisse zu erzielen.
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.
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.
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).
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)
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.
Richtig indizieren ... Ich habe diese Lektion auf die harte Tour vor einiger Zeit gelernt! – Matty
- 1. Ist es besser, eine große Leinwand oder bis zu 100 kleine dynamisch erzeugte Leinwände zu haben?
- 2. MongoDB Abfrage mit einer 'oder' Bedingung
- 3. mit einer Bibliothek verwenden Proguard hat eine @Service Bohne, die
- 4. Ist es möglich, eine Textdatei aus einer SQL-Abfrage auszuführen?
- 5. Höhe div 100% mit einer Polsterung
- 6. Hat die SendGrid-Vorlagen-Engine Bedingungen?
- 7. Hat die ParseFile eine ACL
- 8. Holt eine URL 100 Mal mit Perl
- 9. eine GQL Abfrage erstellen (für Google App Engine), die eine Bedingung auf Reference hat
- 10. NTFS-Verzeichnis hat 100 K Einträge. Wie viel Leistungssteigerung, wenn über 100 Unterverzeichnisse verteilt?
- 11. Anzeige eine div Breite 100% mit Margen
- 12. Was sind die Vor- und Nachteile einer 100% HTTPS-Site?
- 13. Wenn eine Wordpress-Abfrage mit Taxonomie hat weniger als X mit einer anderen Abfrage
- 14. Jmeter friert mit einer CPU von 100% ein
- 15. Suche nach einer Abfrage, die einen Auslöser ausgelöst hat
- 16. Hat SQL eine Bedingung wie 'IS UNIQUE'?
- 17. Abfrage Kosten relativ zu Batch ist 100%
- 18. Wie schreibe ich eine SQL-Abfrage mit einer Bedingung, die eine zweite Tabelle einbezieht?
- 19. CSS - Zentrieren einer Seite - dann die Seite 100% Höhe machen
- 20. mit Linq mit mehreren, wo die Bedingungen
- 21. Testen einer Methode, die eine Observable abonniert hat - Angular 2
- 22. Wie bekomme ich eine Broschüre mit 100% Höhe?
- 23. Methoden, die mit _ enden! hat eine besondere Bedeutung in Scala?
- 24. Ist es möglich, eine SQL-Abfrage mit EntityFramework auszuführen, die drei Tabellen zwischen zwei Datenbanken verbindet?
- 25. Gibt es eine Möglichkeit, eine SELECT nur auszuführen, wenn eine Bedingung in einer anderen Tabelle erfüllt ist?
- 26. Swift Crash auf einer Linie, die nur eine Klammer hat
- 27. Ist C# eine 100% objektorientierte Programmiersprache?
- 28. Ändern einer Spalte in Oracle, die eine Fremdschlüsseleinschränkung hat
- 29. Hat die V8-Javascript-Engine eine GIL?
- 30. Gibt es eine Funktion in MySQL, die die von einer Abfrage zurückgegebenen Ergebnisse komprimiert?
Denken Sie daran, SQL Injection zu vermeiden – SLaks
Vielen Dank. Das wusste ich nicht! – Matty
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. –