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

ビューのMySQLインデックスが機能しない

    ビューにインデックスを作成することはできません: http:/ /dev.mysql.com/doc/refman/5.7/en/view-restrictions.html 、したがって、インデックスが使用されることを期待する必要があります。 https://stackoverflow.com/a/7922711/3595565

    回避策

    ドキュメントの別の部分のコメントに記載されている回避策があります: https://dev.mysql.com/doc/refman/5.5/en/create-view.html 通常のテーブルを作成し、特殊なインデックスを設定して、ビューからテーブルにデータをロードします。

    LOCK TABLES materializedView WRITE; 
    TRUNCATE materializedView; 
    INSERT INTO materializedView SELECT * FROM regularView;
    UNLOCK TABLES;
    

    クエリがインデックスを使用しないのはなぜですか?

    UNIONを使用する場合 SELECTで mysqlは、データを保存するための一時テーブルを作成します。したがって、ビューはより複雑なクエリの「ショートカット」であるため、selectを呼び出すと、再びユニオンが実行され、一時テーブルが使用されます...誘惑可能なアルゴリズムを使用してデータを処理します。

    マニュアルを再度確認する: http://dev.mysql。 com / doc / refman / 5.7 / en / view-restrictions.html

    結論UNION クエリで、ビューがインデックスを使用するのを妨げます。

    出典

    同じ問題に関するmysqlフォーラムでの質問 回答:

    バグレポート「UNIONALLの一時テーブルを作成しないでください」

    MySQL5.7で修正 http:/ /dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html

    プロファイラーを確認するためのいくつかのテストデータ

    CREATE TABLE test1 (
        id int auto_increment PRIMARY KEY,
      col1 varchar(50),
      col2 varchar(50)
    );
    
    CREATE TABLE test2 (
        id int auto_increment PRIMARY KEY,
      col1 varchar(50),
      col2 varchar(50)
    );
    
    INSERT INTO test1 (col1, col2) 
    VALUES 
    ('test', 'testcol2'),
    ('test', 'testcol2'),
    ('test', 'testcol2'),
    ('test', 'testcol2'),
    ('test', 'testcol2'),
    ('test', 'testcol2');
    
    
    INSERT INTO test2 (col1, col2) 
    VALUES 
    ('test2', 'testcol2'),
    ('test2', 'testcol2'),
    ('test2', 'testcol2'),
    ('test2', 'testcol2'),
    ('test2', 'testcol2'),
    ('test2', 'testcol2');
    
    CREATE VIEW testview AS
    SELECT * FROM test1
    UNION
    SELECT * FROM test2;
    

    プロファイラーを確認してください:

    SET PROFILING = 1;
    SELECT * FROM testview WHERE id = 1;
    +----+-------+----------+
    | id | col1  | col2     |
    +----+-------+----------+
    |  1 | test  | testcol2 |
    |  1 | test2 | testcol2 |
    +----+-------+----------+
    SHOW PROFILE;
    +--------------------------------+----------+
    | Status                         | Duration |
    +--------------------------------+----------+
    | starting                       | 0.000017 |
    | Waiting for query cache lock   | 0.000004 |
    | checking query cache for query | 0.000029 |
    | checking permissions           | 0.000006 |
    | Opening tables                 | 0.000121 |
    | System lock                    | 0.000012 |
    | checking permissions           | 0.000014 |
    | checking permissions           | 0.000032 |
    | optimizing                     | 0.000004 |
    | statistics                     | 0.000007 |
    | preparing                      | 0.000006 |
    | executing                      | 0.000003 |
    | Sending data                   | 0.000046 |
    | optimizing                     | 0.000003 |
    | statistics                     | 0.000004 |
    | preparing                      | 0.000003 |
    | executing                      | 0.000002 |
    | Sending data                   | 0.000023 |
    | optimizing                     | 0.000003 |
    | statistics                     | 0.000003 |
    | preparing                      | 0.000003 |
    | executing                      | 0.000002 |
    | Sending data                   | 0.000008 |
    | removing tmp table             | 0.000005 |
    | Sending data                   | 0.000005 |
    | Waiting for query cache lock   | 0.000002 |
    | Sending data                   | 0.000024 |
    | init                           | 0.000011 |
    | optimizing                     | 0.000006 |
    | statistics                     | 0.000004 |
    | preparing                      | 0.000006 |
    | executing                      | 0.000002 |
    | Sending data                   | 0.000021 |
    | end                            | 0.000003 |
    | query end                      | 0.000004 |
    | closing tables                 | 0.000002 |
    | removing tmp table             | 0.000004 |
    | closing tables                 | 0.000006 |
    | freeing items                  | 0.000005 |
    | Waiting for query cache lock   | 0.000003 |
    | freeing items                  | 0.000013 |
    | Waiting for query cache lock   | 0.000002 |
    | freeing items                  | 0.000002 |
    | storing result in query cache  | 0.000003 |
    | logging slow query             | 0.000002 |
    | cleaning up                    | 0.000003 |
    +--------------------------------+----------+
    

    プロファイルからあまり多くの情報を取り出すことはできませんが、結論を検証するのに十分な(私にとっては)一時的なテーブルについて言及しています。




    1. Rails:pggemのインストール中にエラーが発生しました

    2. Javaでpl/sql関数を呼び出しますか?

    3. アマゾンウェブサービス(AWS)の自動スケーリングの概要

    4. InnoDB/MyISAMレコードを挿入するために必要な時間の違い