1

私が理解しているように、典型的なデータベーステーブルのインデックスは、より効率的な行ルックアップを提供します。集計関数を使用したクエリをより効率的にするための同様の構造は存在しますか?

例として、多数の行を持つ以下のようなテーブルがあるとしましょう

Employees
employeeId | office | salary

SELECT office, MAX(salary)
FROM Employees
GROUP BY office

MAX()各事業所から従業員の給与を効率的に回収したい。この場合、追加の挿入/更新のオーバーヘッドは気にしません。これは、このクエリをかなり頻繁に作成し、テーブルへの書き込みを頻繁に行わないためです。

私のエンジンはMySQLのMyISAMです

4

3 に答える 3

2

EXPLAIN を使用して、クエリの実行計画を確認します。次に、インデックスを追加して、クエリの実行計画が改善されるかどうかを確認します。

プロファイリングを使用することもできます。

mysql> SET profiling=ON;
mysql> SELECT…
mysql> SET profiling=OFF;
mysql> SHOW PROFILES;
mysql> SHOW PROFILE FOR QUERY 1;

パーティショニングにより、クエリのパフォーマンスが向上する場合もあります。

于 2011-09-23T09:24:42.993 に答える
1

複合インデックスoffice + salaryが最善の方法です (事前に計算された最大値を別のテーブルに保存したくない場合)。

于 2011-09-23T04:58:12.170 に答える
1

別の問題を探してこれを見つけましたが、ここに特定の問題の解決策があるはずです:

MySQL のドキュメントでは、クエリで MAX() または MIN() を唯一の集計関数として使用すると、最適化によるグループ化が機能すると述べています。その場合、group by フィールドは一番左のインデックス部分である必要があります。

あなたの場合、インデックス(オフィス、給与)がうまくいくはずです。

ドキュメントはこちら: https://dev.mysql.com/doc/refman/5.5/en/group-by-optimization.html

于 2019-11-05T15:47:51.033 に答える