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

MySqlクエリが非常に遅い

    パフォーマンスの違いはおそらく e.id_dernier_fichierによる JOINに使用されるインデックスに含まれていますが、e.codega そのに参加していない インデックス。

    両方のテーブルとそれらのすべてのインデックスの完全な定義がなければ、確実に判断することはできません。また、2つのクエリに2つのEXPLAINPLANを含めると役立ちます。


    ただし、今のところ、いくつか詳しく説明することができます...

    INDEXがクラスター化されている場合(これは主キーにも適用されます)、データは実際にはINDEXの順序で物理的に格納されます。これは、位置xが必要であることを知っていることを意味します INDEXでも、暗黙的に位置xが必要であることを意味します 表にあります。

    ただし、INDEXがクラスター化されていない場合、INDEXはルックアップを提供するだけです。効果的に位置x INDEXの位置yに対応します 表にあります。

    ここで重要なのは、INDEXで指定されていないフィールドにアクセスするときです。そうすることは、データを取得するために実際にTABLEに移動する必要があることを意味します。 CLUSTERED INDEXの場合、すでにそこにいるので、そのフィールドを見つけるオーバーヘッドはかなり低くなります。ただし、INDEXがクラスター化されていない場合は、事実上、テーブルをINDEXに結合してから、目的のフィールドを見つける必要があります。


    ノート; (id_dernier_fichier, codega)に複合インデックスを設定する (id_dernier_fichier)だけに1つのインデックスを付けるのとは大きく異なります (codega)だけの個別のインデックス 。


    クエリの場合、コードを変更する必要はまったくないと思います。しかし、あなたはかもしれません インデックスを変更することでメリットが得られます。

    多くにアクセスしたいとおっしゃっています 田畑。これらすべてのフィールドを複合インデックスに入れることは、おそらく最善の解決策ではありません。代わりに、(id_dernier_fichier)にクラスター化インデックスを作成することもできます。 。これは、* id_dernier_fichier *が特定されると、他のすべてのフィールドも取得するための適切な場所にいることを意味します。


    編集 MySQLおよびクラスター化インデックスに関する注意

    13.2.10.1。クラスタ化インデックスとセカンダリインデックス

    すべてのInnoDBテーブルには、行のデータが格納されるクラスター化インデックスと呼ばれる特別なインデックスがあります。

    • テーブルにPRIMARYKEYを定義すると、InnoDBはそれをクラスター化インデックスとして使用します。
    • テーブルにPRIMARYKEYを定義しない場合、MySQLはNOT NULL列のみを持つ最初のUNIQUEインデックスをプライマリキーとして選択し、InnoDBはそれをクラスター化インデックスとして使用します。
    • テーブルにPRIMARYKEYまたは適切なUNIQUEインデックスがない場合、InnoDBは、行ID値を含む合成列に非表示のクラスター化インデックスを内部的に生成します。行は、InnoDBがそのようなテーブルの行に割り当てるIDで並べ替えられます。行IDは6バイトのフィールドであり、新しい行が挿入されると単調に増加します。したがって、行IDで順序付けられた行は、物理的に挿入順序になります。



    1. インストールされているすべてのOracleバージョンを検出する

    2. SQL SERVER –トリック–異なるWindowsアカウントでSSMSを実行する

    3. 日付文字列をmysql日時フィールドに変換します

    4. ワードパッドでcsvファイルを開いた後、フィールド名を二重引用符で囲みたくない