1

特定の列のすべての値の平均を計算する必要がある状況があります。機能するこのSQLステートメントを取得しました:

SELECT SUM(`unitCost`)/COUNT(*) 
FROM `items` 
WHERE `itemID_FK`=%d

これをより効率的にする方法についての情報を探しています。このクエリにより、多数のレコードを読み取る必要が生じる可能性があります。

itemID_FK別のテーブルで平均値を維持し、レコードがテーブルに追加されるたびに平均値を更新し続ける方が効率的かどうか疑問に思っていましたitemsか?

データベース内の他の列またはテーブルから計算または派生できる列を持つことは、データベース設計の原則に反することをどこかで読みました。

編集:

列:

instanceID    int(10) UN PK AI
userID_FK     int(11) UN
itemID_FK     int(11) UN
dateAdded     date
datePurchased date
listID_FK     int(11) UN
unitCost      decimal(11,2) UN zerofill
quantity      decimal(11,2) UN zerofill
unitID_FK     int(10) UN
4

1 に答える 1

2

これは非常に基本的なクエリであり、実際に高速に実行する方法を見つけることはまずありません。使用できる機能がありavg()ますが、おそらくこれ以上高速にはなりません。

平均を別のテーブルに保持する限り、それデータベース設計の一般的に保持されているベスト プラクティスに反しますが、それができないという意味ではありません。人々はパフォーマンスを向上させるために妥協します。そのようなトレードオフは、ソフトウェア開発者の在庫とトレードです。これを行うと、平均のクエリが高速になりますが、マスター テーブルで挿入、削除、および更新を行うすべての場所で、プログラムの明瞭さとわずかなパフォーマンスが犠牲になります。

于 2012-05-02T11:43:22.537 に答える