Thilo Fester: MySQL: Anfrage auf Existenz eines Tupels mit einer Bedingung

Hey Leute,

mich interessiert, wie ich möglichst effizient eine Existenzanfrage an MySQL stellen kann.

Beispielsweise in einer Tabelle mit dem Schema:

BenutzerNr    Name        Kommentar
0             kalle       ...
1             matze       ...
2             bolle       ...
3             ...         ...
...           ...         ...

Diese Tabelle soll den Namen "benutzer" tragen.
Ich will jetzt mit ein bisschen Perl wissen, ob ein Benutzername bereits in meiner Datenbank vorhanden ist.

Bisher hatte ich das so gelöst:

  
  SELECT 1 FROM benutzer WHERE name = "fritz" LIMIT 1;  

Geht das auch effizienter?

Beste Grüße
Thilo

  1. Hallo Thilo,

    mich interessiert, wie ich möglichst effizient eine Existenzanfrage an MySQL stellen kann.

    SELECT 1 FROM benutzer WHERE name = "fritz" LIMIT 1;

    
    >   
    > Geht das auch effizienter?  
      
    stelle sicher, dass ein Index benutzt wird, siehe <http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html>.  
      
    Je nach Zweck kann es überflüssig sein, eine Existenzanfrage zu stellen.  
    Das ist natürlich effizienter :-)  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. stelle sicher, dass ein Index benutzt wird, siehe http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html.

      BenutzerNr wäre hier der Index. Doch soweit ich die Doku verstehe muss die Spalte, die ich suche ein Index sein. Das ist allerdings nicht der Fall.

      Je nach Zweck kann es überflüssig sein, eine Existenzanfrage zu stellen.
      Das ist natürlich effizienter :-)

      Hm, inwiefern kann ich denn so einen "Zweck" erkennen? Also ich könnte mir vorstellen direkt beim Schreiben in die Tabelle so eine Prüfung einzubauen. Aber das funktioniert in meinem Fall nicht.

      Die Existenzanfrage ist der Zweck ^^

      ~ Thilo

      1. Hallo

        stelle sicher, dass ein Index benutzt wird, siehe http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html.
        BenutzerNr wäre hier der Index. Doch soweit ich die Doku verstehe muss die Spalte, die ich suche ein Index sein. Das ist allerdings nicht der Fall.

        dann ändere dies. Wenn diese Aufgabe oft zu erledigen ist, dann ist ein Index für diese Spalte ganz sicher angebracht und erhöht immens die Effizienz der Anwendung.

        Je nach Zweck kann es überflüssig sein, eine Existenzanfrage zu stellen.
        Das ist natürlich effizienter :-)

        Hm, inwiefern kann ich denn so einen "Zweck" erkennen? Also ich könnte mir vorstellen direkt beim Schreiben in die Tabelle so eine Prüfung einzubauen. Aber das funktioniert in meinem Fall nicht.

        Wenn zum Beispiel die Werte in der Spalte Name eindeutig sein müssen, dann prüft man weder bei INSERT noch bei UPDATE vorher, ob es den Wert, der eingetragen werden soll, schon gibt, sondern man versieht diese Spalte mit einem UNIQUE-Index. Beim Versuch einen Wert zu speichern, den es schon gibt, wird eine entsprechende Fehlermeldung zurückgeliefert, mir der man rechnet, die man entsprechend behandelt. Wurde das Statement hingegen erfolgreich ausgeführt, so war der Wert zulässig. Eine Prüfung vorher ist somit überflüssig, sie erfordert in einer Mehrbenutzerumgebung sowieso die Kapselung in eine Transaktion.

        Freundliche Grüße

        Vinzenz

        1. Danke Vinzenz! Das klingt in der Tat vielsperechen : )

          Ich werde das in mein Zeug einbauen und mal ein paar Vergleichswerte sammeln.

          Beste Grüße
            ~ Thilo