InnoDBでは、すべてのインデックスに主キーが暗黙的に含まれています。
Explainプランは、インデックスIDX_NOME
テーブルPaziente
で使用されます 。 DBMSはインデックスで名前を検索し、ID_PAZIENTE
を見つけます。 そこに、他のテーブルにアクセスするために必要なキーがあります。したがって、追加するものはありません。 (別のDBMSでは、(NOME, ID_PAZIENTE)
に複合インデックスを追加します。 これが起こるために。)
次に、テーブルAnalisi
があります 考慮する。 FK_ANALISI_PAZIENTE
を介してレコードを検索します ID_PAZIENTE
が含まれています これは一致を見つけるために使用され、暗黙的に主キーID_ANALISI
これはテーブルへのアクセスに使用できますが、インデックスから必要なすべての情報を取得しているため、これは必要ありません。テーブルで見つける必要のあるものは何も残っていません。 (ここでも、別のDBMSでは、(ID_PAZIENTE, ID_ANALISI)
に複合インデックスを追加します。 カバーインデックスがあります。)
つまり、何が起こるかというと、単に1つのインデックスを読み取って、他のインデックスを読み取ってカウントします。完全。追加するものはありません。
できた COUNT(analisi0_.ID_ANALISI)
を置き換えます COUNT(*)
を使用 前者は「ID_ANALISI
のレコードをカウントする」としか言いません。 はnullではありません」。これは常にID_ANALISI
の場合です。 テーブルの主キーです。したがって、後者を使用して「レコードをカウント」と言う方が簡単です。ただし、これによってクエリが大幅に高速化されるとは思っていません。
したがって、クエリの観点からは、これを高速化するものは何もありません。頭に浮かぶことは次のとおりです。
- パーティション化されたテーブル?いいえ、これには何のメリットもありません。クエリが並列スレッドで実行された方が速いかもしれませんが、私が知る限り、MySQLの複数のパーティションで並列実行はありません。 (私は間違っているかもしれません。)
- テーブルを最適化しますか?いいえ、クエリではテーブル自体にもアクセスしません。
- それは私たちに残します:より良いハードウェアを購入します。 (これ以上のアドバイスはありません。)