2011-01-06 4 views
0

Lehre erstellt automatisch Indizes für Spalten, die Objektbeziehungen werden verwendet, um zu definieren,deaktivieren automatischer Index auf ähnliche Objekt-ID aus yml

Zum Beispiel

Benutzer: ID, Name

Nachricht: id, SENDER_ID , receiver_id, message

Wenn ich die Beziehung zwischen Nachricht und Benutzer so definiere, dass die Nachricht einen Absender hat und einen Empfänger hat, indiziert Doktrine die Felder sender_id und receive_id automatisch, wenn ich sql vom Modell erzeuge. Ich möchte den Index für den Absender deaktivieren, da ich den Index manuell mit Absender-ID und Empfänger-ID zusammen erstelle. Wie kann ich den automatisch generierten Index deaktivieren?

+0

Sind Sie sicher, dass diese Indizes nutzlos sind? Wird Ihr DBMS bei der Suche nach einem Empfänger den Index mit (sender_id, receiver_id) verwenden? Oder kann er diesen Index nur verwenden, wenn Sie nach einem Sender/Empfänger suchen? – greg0ire

+0

@ greg0ire, ich möchte sender_id index deaktivieren, da (sender_id, receiver_id) kann bereits verwendet werden. Daher wäre nur der Index sender_id unnötig. Irgendwelche Ideen, wie ich es deaktivieren kann? – BugBusterX

+0

ok, ich habe das selbst in MySQL überprüft, es kann einen zusammengesetzten Index verwenden, um nach einem Schlüssel des Indexes zu suchen. Aber ich weiß nicht, wie Sie die Indexierung deaktivieren können. Versuchen Sie, Doctrine Code zu graben, es ist nicht so kompliziert. – greg0ire

Antwort

1

Hallo ich davon ausgegangen Sie MySQL verwendet haben, und warf einen Blick in Lehre/Export/mysql.php ich diese gefunden:

// build indexes for all foreign key fields (needed in MySQL!!) 
if (isset($options['foreignKeys'])) { 
     foreach ($options['foreignKeys'] as $fk) { 
      $local = $fk['local']; 
      $found = false; 
      if (isset($options['indexes'])) { 
      foreach ($options['indexes'] as $definition) { 
       if (is_string($definition['fields'])) { 
        // Check if index already exists on the column        
        $found = $found || ($local == $definition['fields']);  
       } else if (in_array($local, $definition['fields']) && count($definition['fields']) === 1) { 
        // Index already exists on the column 
        $found = true; 
       } 
      } 
     } 
     if (isset($options['primary']) && !empty($options['primary']) && 
       in_array($local, $options['primary'])) { 
      // field is part of the PK and therefore already indexed 
      $found = true; 
     } 

     if (! $found) { 
      if (is_array($local)) { 
      foreach($local as $localidx) { 
       $options['indexes'][$localidx] = array('fields' => array($localidx => array())); 
      } 
     } else { 
       $options['indexes'][$local] = array('fields' => array($local => array()));  
      } 
     } 
    } 
} 

Wenn ich richtig verstehe, den Index zu deaktivieren, sollte Teil der sein Primärschlüssel.

+0

danke für das finden. Es sieht aus wie "count ($ definition ['fields']) === 1" wird nicht zulassen, dass zusammengesetzte Indizes den automatischen Index ersetzen. Die obige Bedingung scheint nur einen einzelnen Spaltenindex zu akzeptieren. – BugBusterX

+0

@BugBusterX: In der Tat, das ändert alles ... also, in der Tat gibt es keine Möglichkeit, diesen Index in Ihrem Fall zu deaktivieren. Ich werde meine Antwort bearbeiten. – greg0ire

Verwandte Themen