![]() |
Datenbank: mysql • Version: 5.x • Zugriff über: devart
Datenbankabfrage dauert 13 Sekunden
Hallo,
ich beziehe ca. 4.000 Datensätze aus einer MySQL Tabelle, welche ca. 300.000 Datensätze aufweißt. Allerdings dauert diese Abfrage 13 Sekunden. Wie kann ich diese verbessern, ohne vorerst in der MySQL Tabelle selber rum zu fuchteln. Hier die Abfrage:
Delphi-Quellcode:
DSListe = TUniTable.DSListe.TableName := '`links`,`kundendaten`'; DSListe.FilterSQL := '(links.link_id = data.link_id) and (links.aufrufe <= 2) and (links.eintrag <> ''delete'') and ((links.date = date1) or (links.date = date2))'; |
AW: Datenbankabfrage dauert 13 Sekunden
Nimm besser ein Query. Den so werden alle 300000DS an den Client übertragen und dort gefiltert
|
AW: Datenbankabfrage dauert 13 Sekunden
Sollte eigentlich nicht, denn die Abfrage von UniTable sieht so aus
Delphi-Quellcode:
SELECT * FROM `links`,`kundendaten`
WHERE (links.link_id = data.link_id) and (links.aufrufe <= 2) and (links.eintrag <> ''delete'') and ((links.date = date1) or (links.date = date2)) |
AW: Datenbankabfrage dauert 13 Sekunden
Wie groß ist die Datenbanktabelle?
Gibt es Indexe auf die Where-Felder? Wie viel Speicher (RAM) darf sich der Server "genehmigen" Virenscanner für die DB-Dateien deaktiviert? |
AW: Datenbankabfrage dauert 13 Sekunden
Beinhalten die 13 Sekunden auch den Verbindungsaufbau zur Datenbank oder steht die schon vorher?
Nur bei der ersten Ausführung innerhalb einer Session oder jedesmal? |
AW: Datenbankabfrage dauert 13 Sekunden
Code:
Das ist ein kartesisches Produkt.
SELECT * FROM `links`,`kundendaten`
|
AW: Datenbankabfrage dauert 13 Sekunden
Ohne WHERE-Klausel wäre es das.
SQL-Code:
Allerdings gehe ich jetzt davon aus, dass es sich um einen C&P-Fehler handelt und data und kundendaten dasselbe sind.
SELECT * FROM `links`,`kundendaten`
WHERE (links.link_id = data.link_id) ... |
AW: Datenbankabfrage dauert 13 Sekunden
Schneller gehts dann nur mit JOINS. Die brauchen auch wesentlich weniger Server-Ressourcen. Das sieht dann so ähnlich aus:
SQL-Code:
Bei deinen Abfragen war übrigens ein Fehler drinnen, der oben beseitigt ist. Wenn du die Tabelle Kundendaten meinst, dann darfst du nicht später diese Tabelle mit data ansprechen. Der MySql-Server sollte diese dann nicht finden. Es würde mich wundern, wenn du mit diesem Query mehr als 1 Ergebnis bekommst (nämlich das Syntax-Fehler-Ergebnis).
SELECT * FROM `links` INNER JOIN `kundendaten`.`link_id` ON `links`.`link_id` WHERE (links.aufrufe <= 2) and (links.eintrag <> ''delete'') and ((links.date = date1) or (links.date = date2))
Bernhard |
AW: Datenbankabfrage dauert 13 Sekunden
Zitat:
|
AW: Datenbankabfrage dauert 13 Sekunden
Zitat:
Es ist aber sinnvoll die SQL-Join-Syntax zu verwenden. |
AW: Datenbankabfrage dauert 13 Sekunden
Zitat:
SQL-Code:
SELECT * FROM `links` L INNER JOIN `kundendaten` D ON L.`link_id` = D.`link_id`
|
AW: Datenbankabfrage dauert 13 Sekunden
Das wäre mir aber doch sehr neu, das ein JOIN schneller sein soll als ein where Tab1.id=tab2.id.
Wie groß ist denn ein Datensatz der hierdurch generiert wird?
Code:
Jedes Byte muß sich erst einmal über die Netzleitung quälen, und je mehr davon, desto langsamer!
SELECT * FROM `links`,`kundendaten`
Und was wird damit gemacht? Die Anzeige von z.B. SQL+ ist so quälend langsam, daß jedes Ergebnis mit mehr als 1 Mb Größe zum Geduldsspiel wird. Da sind 13 Sekunden ein Klacks. Gruß K-H |
AW: Datenbankabfrage dauert 13 Sekunden
Zitat:
Die Tabelle "links" besitzt ca. 200.000 Datensätze (steigend) Die Tabell "Daten" (KundenDaten) besitzt ca. 60.000 Datensätze, ebenfalls steigend. (kundendaten und data wr allerdings nur ein Abtipp Fehler ins Forum also keiner im Programm) Indexe auf link_id beider Tabellen. Kein Virenscanner für die DB und der Server besitzt 8GB Arbeitsspeicher, die zur vollen Verfügung stehen.
Delphi-Quellcode:
verbraucht die vollen 13 Sekunden
DSListe.Open;
|
AW: Datenbankabfrage dauert 13 Sekunden
Zitat:
Enorm Zeit der Abfrage übersteigt die 2 Minuten, dann hab ich abgebrochen |
AW: Datenbankabfrage dauert 13 Sekunden
Wie ist es so (ich habe allerdings keine Ahnung, was date1 und date2 sind)?
SQL-Code:
SELECT
* FROM `links` L JOIN `kundendaten` D ON D.link_id = L.link_id WHERE L.aufrufe <= 2 AND L.eintrag <> 'delete' AND L.date IN(date1,date2) |
AW: Datenbankabfrage dauert 13 Sekunden
Ich habe jetzt die beiden anderen Felder auch indiziert in der mysql Tabelle und die Abfrage ist auf 3 Sek geschrumpft, normal oder immernoch zu hoch?
|
AW: Datenbankabfrage dauert 13 Sekunden
Delphi-Quellcode:
nun brauch die Abfrage nur noch 1,24 Sekunden.
AND L.date IN(date1,date2)
Super, Danke |
AW: Datenbankabfrage dauert 13 Sekunden
Brauchst Du wirklich alle Felder aus beiden Tabellen? Ich denke, eine Einschränkung auf die wirklich benötigten könnte auch noch etwas bringen.
|
AW: Datenbankabfrage dauert 13 Sekunden
werde ich gleich versuchen
|
AW: Datenbankabfrage dauert 13 Sekunden
Jau, ich hoffe mal ganz stark, dass das was noch etwas herausholt. Weil ein "Select *" heißt bei uns in der Firma einige Euros ins Abteilungs-Sparschwein...
|
AW: Datenbankabfrage dauert 13 Sekunden
Schlimmer wäre aber ein fehlendes/falsches where oder on
|
AW: Datenbankabfrage dauert 13 Sekunden
Das stimmt, aber hat ja andere (wohl noch schlimmere) Auswirkungen. Steht bei uns nicht auf der Dafür-muss-man-Strafe-zahlen-Liste, weil wir das für selbstverständlich ansehen :P
|
AW: Datenbankabfrage dauert 13 Sekunden
Sicherlich, aber zig unbenötigte Felder (womöglich noch inkl. BLOBs) übers Netzwerk zu schaufeln ist auch keine gute Idee.
|
AW: Datenbankabfrage dauert 13 Sekunden
Richtig mormalisierte Tabellen sollten eher klein sein.
|
AW: Datenbankabfrage dauert 13 Sekunden
Wie viele Zeilen hat das Resultat?
Sind datensensitive Steuerelemente angeschlossen, also ein DBGrid, DBEdits? Ich sehe zu, das ich so 100-200 Datensätze in weniger als 500ms bekomme (inklusive Anzeige). |
AW: Datenbankabfrage dauert 13 Sekunden
Also ich eralte nun 3600 Datensätze mit Anzeige in 1,7 Sekunden, da ich das alles in einem Thread laufen lasse, kann ich die 2 Sekunden mit einem Lade Screen überbrücken, Ich denke viel schneller wird es nicht mehr gehen.
|
AW: Datenbankabfrage dauert 13 Sekunden
Hi,
eine andere Frage wäre, ob du alle 3600 Einträge auf einmal brauchst. Das hängt halt auch davon ab, was du mit ihnen tun willst... Liebe Grüße, Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz