YML

2011-01-06 2 views
0

から関連するオブジェクトIDに無効自動索引教義が自動的にオブジェクトの関係を定義するために使用される列のインデックスを作成し、YML

例えば

ユーザ:ID、名前

メッセージ:ID、SENDER_ID 、receiver_id、message

メッセージが1人のSenderを持ち、1つのReceiverを持つようにメッセージとユーザーの関係を定義すると、モデルからsqlを生成するときにdoctrineが自動的にsender_idとreceiver_idフィールドをインデックスします。 sender_idとreceiver idを一緒に使用してインデックスを手動で作成するので、送信者のインデックスを無効にしたいと思います。自動生成インデックスを無効にするにはどうすればよいですか?

+0

これらのインデックスは役に立たないですか?受信者を検索するとき、DBMSは(sender_id、receiver_id)でインデックスを使用しますか?または、彼は送信者/受信者のカップルを検索するときにのみ、このインデックスを使用することができますか? – greg0ire

+0

@ greg0ire(sender_id、receiver_id)は既に使用できるので、sender_idインデックスを無効にしたいと思います。だから、sender_idだけのインデックスは不要です。私はそれを無効にすることができますどのようなアイデア? – BugBusterX

+0

私は自分自身をMySQLでチェックしました。複合インデックスを使用してインデックスのキーを検索できます。しかし、どのようにインデックスを無効にできるのか分かりません。 Doctrineのコードを掘り下げてみてください。複雑ではありません。 – greg0ire

答えて

1

こんにちは、私はあなたがMySQLを使用していたと仮定し、私はこれを見つけた 教義/エクスポート/のmysql.phpで見ていた:

// 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()));  
      } 
     } 
    } 
} 

私はの一部であるべきインデックスを無効にするには、正しく理解していれば主キー。

+0

見つけてくれてありがとう。 "count($ definition ['fields'])=== 1"のように見えますが、コンポジットインデックスが自動インデックスを置き換えることはできません。上記の条件は、単一列のインデックスのみを受け入れるようです。 – BugBusterX

+0

@BugBusterX:確かに、これはすべて変更されています...実際、あなたのケースでこのインデックスを無効にする方法はありません。私は私の答えを編集するつもりです。 – greg0ire

関連する問題