2012-05-02 7 views
1

特定の列のすべての値の平均を計算する必要がある状況があります。大きなMYSQLテーブルの特定の列の浮動小数点値の平均を計算する

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

私はこれをより効率的にする方法についてのインプットを探しています。このクエリは、潜在的に多数のレコードを読み取らなければならなくなる可能性があります。

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

私はそれがデータベース内の他のカラムやテーブルから計算または導出することができ、列を持つようにデータベース設計の原則に反していることをどこかで読みました。

EDIT:

列:

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 
+0

あなたのテーブルの 'itemID_FK'は' index'ですか?ちなみに、 'AVG'関数はあなたが望むものも返すべきです。 –

+0

MabyはSUM()/ COUNT(*) 'AVG(unitCost)の代わりにAVGを使用することができます 投稿項目 ここitemID_FK =%d GROUP BY unitCost' –

+0

リンクを含める:http://www.tizag.com/mysqlTutorial /mysqlavg.php –

答えて

2

非常に基本的なクエリだし、それはあなたがそれが実際より速く走らせるためにどのような方法を見つけることができますことは考えにくいです。 avg()機能がありますが、これはおそらくそれほど速くはありません。

別のテーブルの平均値を維持する限り、データベースデザインの一般的なベストプラクティスに対してはですが、それはできません。人々はパフォーマンスを向上させるために妥協する。そのようなトレードオフはソフトウェア開発者の株式と貿易です。これを行うと、プログラムの明快さと、マスターテーブルでの挿入、削除、および更新を行うすべての場所で少しのパフォーマンスを犠牲にして、平均化のクエリが高速になります。

+1

ストアドプロシージャを使用して更新/挿入を行うことは可能かもしれないので、プログラム内の明確さがそれほど悪くないかもしれません。 – Argeman

関連する問題