AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [MySQL]existenz eines datensatzes prüfen: was ist schneller?
Thema durchsuchen
Ansicht
Themen-Optionen

[MySQL]existenz eines datensatzes prüfen: was ist schneller?

Ein Thema von Aenogym · begonnen am 26. Mär 2006 · letzter Beitrag vom 27. Mär 2006
Antwort Antwort
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#1

[MySQL]existenz eines datensatzes prüfen: was ist schneller?

  Alt 26. Mär 2006, 16:34
Datenbank: MySQL • Version: 5 • Zugriff über: Zeos
hi ihr,

der titel ist vielleicht etwas unschön gewählt.
ich habe meine tabelle "accounts" (typ MyISAM). struktur:
Code:
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`pass` varchar(32) NOT NULL,
`online` enum('1','0') NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
jetzt möchte ich prüfen, ob ein eintrag für einen bestimmten user existiert. da die tabelle sehr viele datensätze enthalten wird, suche ich die schnellste methode. bisher mache ich es so:
SELECT id FROM accounts WHERE name = 'max_mustermann' LIMIT 1 dann prüfe ich einfach, ob ich eine zeile erhalten habe. andererseits könnte ich ja auch folgendes abfragen:
SELECT count(*) FROM accounts WHERE name = 'max_mustermann' wenn count(*) dann 1 ist, hab ich eine zeile.

meine frage ist jetzt, welches die schnellste methode ist, den datensatz auf existenz zu prüfen (vielleicht habt ihr ja noch ganz andere herangehensweisen - ich bin da sehr offen )

danke schonmal,
aenogym
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: [MySQL]existenz eines datensatzes prüfen: was ist schnel

  Alt 26. Mär 2006, 16:55
Also zuallererst: Leg mal einen Index auf die Namens-Spalte an. Da du diese als Selektionskriterium nimmst, spart das schon mal einen Haufen Zeit bei den Lesezugriffen (das Schreibzugriffe dauern dafür länger).

Ich bin nicht sicher, wann LIMIT ausgeführt wird. Bestenfalls wird nach dem ersten Vorkommen aufgehört zu suchen, dann ist die Variante mit LIMIT die schnellste. Schlimmestenfalls werden alle gefunden und dann erst LIMIT ausgeführt. Im Mysql-Manual sollte aber drin stehen, in welcher Reihenfolge die einzelnen Klauseln ausgeführt werden.

Falls LIMIT, wie oben angesprochen, erst am Ende ausgeführt werden sollte, dann würde ich die Variante mit dem COUNT empfehlen, sonst die mit dem LIMIT. Der Index tut aber in beiden Fällen gut.


Edit: Ich sehe gerade, name ist UNIQUE - könnte gut sein, dass UNIQUE einen normalen Index miteinschließt, ich bin nicht sicher.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: [MySQL]existenz eines datensatzes prüfen: was ist schnel

  Alt 26. Mär 2006, 17:07
Zitat von Chewie:
Ich bin nicht sicher, wann LIMIT ausgeführt wird. Bestenfalls wird nach dem ersten Vorkommen aufgehört zu suchen, dann ist die Variante mit LIMIT die schnellste. Schlimmestenfalls werden alle gefunden und dann erst LIMIT ausgeführt. Im Mysql-Manual sollte aber drin stehen, in welcher Reihenfolge die einzelnen Klauseln ausgeführt werden.
Leider werden die Limits erst nach dem Selektieren aller zutreffenden Datensaetze angewandt. Das heisst, wenn 2000 Datensaetze auf deine Bedingung zutreffen, dann werden die erstmal alle rausgeholt. Anschliessend wird alles, was du nicht brauchst, weggeworfen. Kann sein dass sich das geaendert hat/noch aendert; in mySQL4 ist es aber definitiv noch so.

Aber auch das count(*) ist nicht optimal. Du solltest count(<idfeld>) verwenden; dies spart zeit.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: [MySQL]existenz eines datensatzes prüfen: was ist schnel

  Alt 26. Mär 2006, 17:09
Zitat von alcaeus:
Aber auch das count(*) ist nicht optimal. Du solltest count(<idfeld>) verwenden; dies spart zeit.
Ist das bei COUNT nicht egal? Das DBMS sollte doch erkennen, dass die Spalte in einer Aggregatfunktion verwendet wird, der egal ist, auf welche Spalten sie angewandt wird, oder nicht?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#5

Re: [MySQL]existenz eines datensatzes prüfen: was ist schnel

  Alt 26. Mär 2006, 17:12
Zitat von Chewie:
Ist das bei COUNT nicht egal? Das DBMS sollte doch erkennen, dass die Spalte in einer Aggregatfunktion verwendet wird, der egal ist, auf welche Spalten sie angewandt wird, oder nicht?
Anscheinend nicht. Ich hab dies nie genauer nachvollzogen, aber es mal irgendwo gelesen und manchmal auch schon selbst bemerkt.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: [MySQL]existenz eines datensatzes prüfen: was ist schnel

  Alt 26. Mär 2006, 17:21
Count(*) ist ein wunderbares Tuning-Mittel - wenn keine WHERE-Klausel verwendet wird. Da MySQL 4 noch keinen Existenz-Operator unterstützt, halte ich die erste Variante für die Beste - allerdings macht LIMIT 1 bei einem UNIQUE INDEX keinen Sinn.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: [MySQL]existenz eines datensatzes prüfen: was ist schnel

  Alt 26. Mär 2006, 18:53
@marabu: das mit dem LIMIT und dem UNIQUE INDEX stimmt irgendwie
und dass count(*) äußerst optimiert ist, wenn WHERE nicht zum einsatz kommt habe ich auch schon gelesen. nur leider brauche ich ja das where...

also ich habe jetzt meine 'id'-spalte rausgeschmissen (ist überflüssig, da die nutzernamen auch eindeutig sein sollen -> PRIMARY gemacht). und abfragen tu ich das ganze jetzt mit SELECT count(name) FROM accounts WHERE name = 'max'. bin recht zufrieden damit

danke euch allen!
aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#8

Re: [MySQL]existenz eines datensatzes prüfen: was ist schnel

  Alt 26. Mär 2006, 19:51
Zitat von Aenogym:
also ich habe jetzt meine 'id'-spalte rausgeschmissen (ist überflüssig, da die nutzernamen auch eindeutig sein sollen -> PRIMARY gemacht). und abfragen tu ich das ganze jetzt mit SELECT count(name) FROM accounts WHERE name = 'max'. bin recht zufrieden damit
Wenn du Abfragen ueber den Namen machst, dann lege einen Index auf die Namen-Spalte; aufgrund der Normalisierung solltest du (wenn die Benutzerdaten in anderen Tabellen benoetigt werden) etwas eindeutiges verwenden; wenn jemand seinen Nutzernamen aendern moechte, dann hast du ein Problem mit deiner Methode (es sei denn du verhinderst das Aendern komplett)

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: [MySQL]existenz eines datensatzes prüfen: was ist schnel

  Alt 27. Mär 2006, 16:45
ja, ich habe die name-spalte als primärindex definiert. und ja, eine änderung des namens ist nicht möglich

aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz