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

日付関数で列を折り返すときにmysqlがインデックスにヒットする理由

    EXPLAINレポートは解釈が難しいことが知られています。彼らはいくつかのフィールドにあまりにも多くの情報をオーバーロードしました。試してみてください

    type: index index-scanを実行していることを示します 、これは、インデックス内のすべてのエントリにアクセスしていることを意味します。

    これは、クラスター化(プライマリ)インデックスではなくセカンダリインデックスに対して行われることを除いて、テーブルスキャンと同じ数のエントリにアクセスします。

    type: indexが表示されたら 、EXPLAINはpossible_keys: NULLを示しています つまり、効率的に検索するためにインデックスを使用することはできません。ただし、key: add_timeも表示されます これは、インデックススキャンに使用しているインデックスがadd_timeであることを意味します 。

    インデックススキャンは、MySQLがそれ自体で式や関数呼び出しを最適化できないという事実によるものです。たとえば、特定の月の日付を検索しようとすると、month(add_time) = 4を検索できます。 ただし、その月の日付はインデックス全体に散在しており、すべてがグループ化されているわけではないため、add_timeのインデックスは使用されません。

    date(add_time) インデックスで検索できるはずですが、MySQLはその推論を行いません。 MySQLは、関数を使用していることを認識するだけで、インデックスを使用しようとさえしません。

    これが、MySQL5.7が生成された列 式にインデックスを付けることができるようにするために、MySQL 8.0は、式に定義されたインデックス 最初に生成された列を定義する必要はありません。



    1. DriverManager適切なドライバーがありませんmysql

    2. セロリから挿入を実行するときにmysqlコマンドが同期していません

    3. django.db.utils.IntegrityError:列venue_cityにnull値が含まれています

    4. 大きなMySQLテーブルを複数の小さなファイルとしてエクスポートする