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

2つのテーブル間の単純なクエリでMySQLが遅すぎる

    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の複数のパーティションで並列実行はありません。 (私は間違っているかもしれません。)
    • テーブルを最適化しますか?いいえ、クエリではテーブル自体にもアクセスしません。
    • それは私たちに残します:より良いハードウェアを購入します。 (これ以上のアドバイスはありません。)



    1. Pythonを使用してMySQLにJSONを挿入する

    2. MySQLクエリ結果をCSV形式で出力するにはどうすればよいですか?

    3. phpメタフォンとsoundexのMysql相当

    4. CodeIgniter画像ファイルをアップロードできません