verwendetes Datenbanksystem: MySQL
Hallo,
grundsätzlich sind mir die Optimierungen einer MySQL geläufig, stehe aber nun vor einem Problem, wo ich etwas Unterstützung brauche:
Meine C-Sharp Klasse ist ein MySQL-Datenbank-Handler. Diese Klasse hat eine Funktion "TryAddItemToDatabase(...)". Diese Funktion wird an vielen anderen Stellen der Applikation aufgerufen. Folgendes Problem (deswegen Try...) kann nun auftreten: Der Datensatz, der eingetragen werden soll, existiert schon. Daher muss ich im ersten Schritt prüfen, ob dieser Datensatz schon in der DB vorhanden ist. Diese Tabelle hat allerdings knapp 1 Mio Einträge und daher dauert dies aktuell etwas lange.
Die Datenbank sieht im folgenden so aus:
id: int
x, y, z (+ knapp 30 andere Einträge): string/date/int Werte
Wenn ein Eintrag mal erstellt worden ist, dann wird dieser über die ID indentifiziert, daher hat diese Spalte einen Index mit Primary. Dies geht somit super schnell. Langsam ist nur die Überprüfung, ob der Datensatz schon existiert. Dies mache ich mit einem "SELECT id FROM tabelle WHERE >>alle Werte<<".
Hier sind dann keine Indexe mehr gesetzt und daher muss die DB ja alle Datensätzen durchgehen, daher dauert das so lange. Jemand einen Tipp, wie man dies schneller hinbekommt?
Dankend
Stefan
wenn der datensatz schon existiert sol er dann ersetzt werden?
in dem Fall bringt replace vielleicht einen vorteil (ungetestet)
"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."
Ich würde einen Index auf die Spalten setzen, die eindeutig sein müssen.
Also wenn die Kombination aus x,y,z eindeutig sein muss, einen Index auf x,y,z setzen.
Anderweitig wird das kaum gehen.
Dann könntest du einfach ein Insert machen - die Datenbank kanns ja nicht einfügen wenn der Index verletzt wird. Eine Überprüfung vorher ist dann nicht notwendig.
Hi,
vielen Dank für eure schnellen Antworten. Die bringen mich weiter. Bin schon fleißig dabei!
Dankend
Stefan
SELECT COUNT(id) FROM tabelle WHERE id = @id
Wenn COUNT(id) < 0 dann gibts das ding schon.
Aggregatfunktion sind schnell. Das sollte funktionieren.
heute code ich, morgen debug ich und übermorgen cast ich die königin auf int
Hallo S.R.
Du kannst auch etwas versuchen wie:
INSERT INTO tbl
SELECT 1, 'abc', 'blah'
WHERE NOT EXISTS
(
SELECT 1
FROM tbl
WHERE col1 = 1 AND col2 = 'abc' AND col3 = 'blah'
)
Achtung
Dabei musst du mal nachlesen wie sich MySQL beim Read-Locking verhält. Ggf. musst du hier einen LOCK-Hint angeben (bei SQL Server ist's so).
Ich selbst würde den Weg wählen den Satanlike beschrieben hat.
Grüße
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.