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

複雑なクエリは転送に時間がかかりすぎる

    交差テーブルに複合インデックスが必要です:

    ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);
    

    そのインデックスの列の順序は重要です!

    期待しているのは、結合が機器テーブルで始まり、id_instrumentに基づいて複合インデックスで一致するインデックスエントリを検索することです。次に、そのインデックスエントリが見つかると、関連するid_toolが無料で提供されます。したがって、instrument_toolsテーブルを読み取る必要はなく、インデックスエントリを読み取るだけで済みます。これにより、instruments_toolsテーブルのEXPLAINに「Usingindex」コメントが表示されます。

    これは役立つはずですが、グループ化および並べ替える列はインデックスを使用できないため、一時テーブルとファイル並べ替えを回避することはできません。

    一時テーブルに使用できるメモリのサイズを増やすことで、MySQLが一時テーブルをディスクに書き込まないようにすることができます。

    mysql> SET GLOBAL tmp_table_size = 256*1024*1024;      -- 256MB
    mysql> SET GLOBAL max_heap_table_size = 256*1024*1024; -- 256MB
    

    その図は単なる例です。あなたの場合、一時テーブルのサイズがどれくらいになるかわかりません。




    1. 空のクラスター化テーブルへのINSERT…SELECTによる最小限のロギング

    2. MySQL8.0をRHEL/CentOS8/7およびFedora35にインストールする方法

    3. コンパイル・エラーを伴うOracleトリガーの作成、ORA-02289:シーケンスが存在しません

    4. MySQLのSQLクエリでIN句としてArrayList<>を渡す方法