Laden...

MySQL-Datenbankoptimierung: Vorhandensein eines Datensatzes prüfen

Erstellt von S.R. vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.701 Views
S
S.R. Themenstarter:in
221 Beiträge seit 2007
vor 14 Jahren
MySQL-Datenbankoptimierung: Vorhandensein eines Datensatzes prüfen

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

D
496 Beiträge seit 2005
vor 14 Jahren

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."

S
133 Beiträge seit 2006
vor 14 Jahren

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.

S
S.R. Themenstarter:in
221 Beiträge seit 2007
vor 14 Jahren

Hi,

vielen Dank für eure schnellen Antworten. Die bringen mich weiter. Bin schon fleißig dabei!

Dankend

Stefan

U
237 Beiträge seit 2007
vor 14 Jahren
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

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.