sql >> データベース >  >> RDS >> Mysql

クロステーブルインデックスは可能ですか?

    ご存知のように、SQLServerはインデックス付きビュー を使用してこれを実現します。 :

    SQLServerでは、この手法を利用するには、テーブルではなくビューに対してクエリを実行する必要があります。つまり、ビューとインデックスについて知っておく必要があります。

    MySQLにはインデックス付きビューがありませんが、テーブル+トリガー+インデックスを使用して動作をシミュレートできます

    ビューを作成する代わりに、インデックス付きテーブル、データテーブルを最新の状態に保つためのトリガーを作成する必要があります。次に、正規化されたテーブルではなく、新しいテーブルをクエリする必要があります。

    書き込み操作のオーバーヘッドが読み取り操作の改善を相殺するかどうかを評価する必要があります。

    編集済み:

    新しいテーブルを作成する必要は必ずしもないことに注意してください。たとえば、1:N関係(マスター-詳細)トリガーでは、フィールドのコピーを「マスター」テーブルから「詳細」テーブルに保持できます。あなたの場合:

    CREATE TABLE tableOne (
        id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
        tableTwoId INT UNSIGNED NOT NULL,
        objectId INT UNSIGNED NOT NULL,
        desnormalized_eventTime DATETIME NOT NULL,
        INDEX (objectID),
        FOREIGN KEY (tableTwoId) REFERENCES tableTwo (id)
    ) ENGINE=InnoDB;
    
    CREATE TRIGGER tableOne_desnormalized_eventTime
       BEFORE INSERT ON tableOne
    for each row
    begin
      DECLARE eventTime DATETIME;
      SET eventTime = 
          (select eventTime 
           from tableOne
           where tableOne.id = NEW.tableTwoId);
      NEW.desnormalized_eventTime = eventTime;
    end;
    

    これは挿入前のトリガーであることに注意してください。

    これで、クエリは次のように書き直されます。

    select * from tableOne t1 
      inner join tableTwo t2 on t1.tableTwoId = t2.id
      where t1.objectId = '..'
      order by t1.desnormalized_eventTime;
    

    免責事項:テストされていません。



    1. Access2016でテーブルからサブフォームを作成する方法

    2. Ubuntu-12.04-MySqlはサービスmysqlstartを使用して起動しません

    3. スキーマとビューを使用してPostgreSQLユーザーアクセスを制限する

    4. Neo4j-Cypherを使用してMATCHでデータを選択する