2009-05-13 10 views
0

In PHP + MySQL + PDO, wäre es viel langsamer ein Element ID namentlich Zwei Abfragen vs einer Abfrage, Performance

  • Erhalten Datenelement von ID zu tun

    • Get als nur

      • Get Artikeldaten nach Namen

      Letzteres ist nur eine Abfrage, also offensichtlich schneller. Ersteres sorgt jedoch für einen saubereren Code (weil die ID des Artikels oft auch nur vorher bekannt ist), daher wäre es besser, wenn der Leistungsunterschied klein genug ist.

      Der Code, wo ich dieses bin mit:

      public function actionView() {

      // read http request 
          ... 
      
          // get item 
          $itemModel = new Rust_Model_Item(); 
          try { 
           $id = $itemModel->getItemIdByUrlTitle($urltitle); 
           $item = $itemModel->getItem($id); // lots of data 
          } catch (Rust_Model_Item_NotFoundException $e) { 
           throw new FastMVC_Web_Error(404, 'Item not found'); 
          } 
      
          ... 
      
      } 
      

      http://code.heukelom.net/filedetails.php?repname=rust&path=%2Ftrunk%2Flib%2Fclasses%2FRust%2FController%2FItem.php

      public function getItem ($ id) {

      $item = $this->getItemBasics($id); 
      
          $catModel = new Rust_Model_Category(); 
          $item['category'] = $catModel->getById($item['category_id']); 
      
          $ratingModel = new Rust_Model_Rating(); 
          $item['rating'] = $ratingModel->getForItem($id); 
      
          $pageModel = new Rust_Model_Page(); 
          $item['pages'] = $pageModel->getListForItem($id); 
      
          $tagModel = new Rust_Model_Tag(); 
          $item['tags'] = $tagModel->getForItem($id); 
      
          return $item; 
      
      } 
      

      http://code.heukelom.net/filedetails.php?repname=rust&path=%2Ftrunk%2Flib%2Fclasses%2FRust%2FModel%2FItem.php

  • +0

    Unabhängig von den 'Referenzdaten' sollten Sie alle Informationen mit JOINS aus anderen Tabellen und Unterabfragen zusammenstellen können. Seht Dinge wie SELECT foo FROM bar WHERE foo IN an (SELECT baz FROM boo) –

    +0

    Ich bin recht geübt in SQL, das ist nicht das Problem. Es ist nicht so, dass ich nicht weiß, was die einzelne Abfrage sein würde, aber dass es sich negativ auf mein Design auswirken würde. –

    Antwort

    2

    Sie sollten Ihre Abfrage so entwerfen, dass die Felder, die Sie in Ihrer WHERE-Klausel verwenden, über geeignete Schlüssel und Indizes verfügen und nur eine Abfrage verwenden, um sie auszuwählen.

    1

    Warum nicht eine einzige Abfrage erstellen, die die Elementdaten nach ID abruft und einen Index auf die ID setzt.

    +0

    Wenn er aber auch einen Index auf den Namen setzt, könnte er je nach Situation wählen, welchen er verwenden soll. –

    +0

    Wegen der Art und Weise, wie ich die Datenzugriffsteile in meine Funktionen einfüge. Ich habe eine ziemlich große Funktion, die die Item-Daten per ID abruft. Irgendwie fühlt es sich weniger sauber an, diese Funktion zu erweitern, um mit Namen zu arbeiten (und wer weiß, welche andere zukünftige Bedingung). In Bezug auf sauberen Code wäre es besser, zuerst die ID und dann die Daten auszuwählen. Ich mache mir nur Sorgen um die Leistung. –

    +0

    Wenn Sie Objektmitglieder bei Bedarf aus der Datenbank holen, sollten Sie eine Form der 'Verwendungs-ID' verwenden, die den Aufrufer identifiziert (__LINE__, __FILE__ könnte helfen). Führen Sie einen Pro-Member-Abruf durch, aber cachen Sie diejenigen, die sie verwendet haben. Auf diese Weise können Sie sie beim nächsten Mal und per Zugriff laden, während andere den Kontrollfluss anzeigen –