ホームページ > データベース > mysql チュートリアル > MySQLの各グループの最後のレコードを効率的に見つける方法は?

MySQLの各グループの最後のレコードを効率的に見つける方法は?

Patricia Arquette
リリース: 2025-01-25 19:32:11
オリジナル
295 人が閲覧しました

How to Efficiently Find the Last Record in Each Group in MySQL?

各グループの最後の記録を取得するために効率的

問題の説明

次の表を考えてみましょう を使用した基本的なグループクエリは、次の結果が生成されます。

ただし、予想される出力は各グループの最新レコードです。

messagessolution

Id Name Other_Columns
1 A A_data_1
2 A A_data_2
3 A A_data_3
4 B B_data_1
5 B B_data_2
6 C C_data_1

ウィンドウ関数(MySQL 8.0以降)を使用してくださいSELECT * FROM messages GROUP BY NameMySQL 8.0は、各グループの最後の記録を見つけるためのエレガントなソリューションを提供するために、ウィンドウ関数を導入しました。次のクエリでは、この目的を達成するために関数を使用します:

Id Name Other_Columns
1 A A_data_1
4 B B_data_1
6 C C_data_1

lept join(MySQLの初期バージョン) MySQL 8.0の前に、最も効果的な解決策は

Id Name Other_Columns
3 A A_data_3
5 B B_data_2
6 C C_data_1

を使用することです。 パフォーマンスと適用性両方のソリューションは非常に効率的ですが、そのパフォーマンスはデータの規模と分布によって異なる場合があります。大規模で多様なデータセットの場合、通常、ウィンドウ関数法が推奨されます。

データが特定のモード(各グループの記録が比較的少ないなど)を提示する場合、メソッドがより効率的になる場合があります。

ベンチマークテストROW_NUMBER()

<code class="language-sql">WITH ranked_messages AS (
  SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn
  FROM messages AS m
)
SELECT * FROM ranked_messages WHERE rn = 1;</code>
ログイン後にコピー
多くの場合、

メソッドはテクノロジーのグループ化よりも優れていることが証明されています。たとえば、何百万回もの行を持つ大きなデータベースでは、メソッドの実行時間は1秒未満であり、グループ化テクノロジーには1分以上かかります。 ただし、最適な方法を決定するために、特定のデータセットでこれら2つのソリューションをテストすることを常にお勧めします。

以上がMySQLの各グループの最後のレコードを効率的に見つける方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート