です。本当に怪しいMySQLテーブルがあります各グループの平均。計算は〜15時間実行され、私は強い気分がある私はそれが間違っているだよ。SQLマジック - クエリは15時間かかるべきではありませんが、
まず、巨大なテーブルのレイアウト:
category
element_id
date_updated
value
weight
source_prefix
ここ
source_name
だけキーがelement_id
(BTREE、〜8kのユニークな要素)です。
と計算プロセス:
各グループおよびサブグループのためのハッシュを作成します。
CREATE TEMPORARY TABLE `temp1` (INDEX (`ds_hash`))
SELECT `category`,
`element_id`,
`source_prefix`,
`source_name`,
`date_updated`,
`value`,
`weight`,
MD5(CONCAT(`category`, `element_id`, `source_prefix`, `source_name`)) AS `subcat_hash`,
MD5(CONCAT(`category`, `element_id`, `date_updated`)) AS `cat_hash`
FROM `bigbigtable` WHERE `date_updated` <= '2009-04-28'
私は本当にハッシュで、この騒ぎを理解していないが、それはより速く、このように働きました。暗い魔法、私は推測する。
各サブグループ
CREATE TEMPORARY TABLE `temp2` (INDEX (`subcat_hash`))
SELECT MAX(`date_updated`) AS `maxdate` , `subcat_hash`
FROM `temp1`
GROUP BY `subcat_hash`;
の最大の日付がカテゴリ
CREATE TEMPORARY TABLE `valuebycats` (INDEX (`category`))
SELECT `temp1`.`element_id`,
`temp1`.`category`,
`temp1`.`source_prefix`,
`temp1`.`source_name`,
`temp1`.`date_updated`,
AVG(`temp1`.`value`) AS `avg_value`,
SUM(`temp1`.`value` * `temp1`.`weight`)/SUM(`weight`) AS `rating`
FROM `temp1` LEFT JOIN `temp2` ON `temp1`.`subcat_hash` = `temp2`.`subcat_hash`
WHERE `temp2`.`subcat_hash` = `temp1`.`subcat_hash`
AND `temp1`.`date_updated` = `temp2`.`maxdate`
GROUP BY `temp1`.`cat_hash`;
(加重平均値を見つけるために、TEMP2とTEMP1を検索参加、今私はそれを見て、それをすべてを書いたこと私はその最後のクエリ(900k * 900kのテンポラリテーブルを避けるために)でINNER JOINを使うべきだと私には思われます。
まだ、普通の方法でがそうですか?
UPD:参照のためのいくつかの画像:
削除死んImageShackのリンク
UPD:提案されたソリューションのためにEXPLAIN:
+----+-------------+-------+------+---------------+------------+---------+--------------------------------------------------------------------------------------+--------+----------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------+---------------+------------+---------+--------------------------------------------------------------------------------------+--------+----------+----------------------------------------------+
| 1 | SIMPLE | cur | ALL | NULL | NULL | NULL | NULL | 893085 | 100.00 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | next | ref | prefix | prefix | 1074 | bigbigtable.cur.source_prefix,bigbigtable.cur.source_name,bigbigtable.cur.element_id | 1 | 100.00 | Using where |
+----+-------------+-------+------+---------------+------------+---------+--------------------------------------------------------------------------------------+--------+----------+----------------------------------------------+
さて、私は説明しようとします。 この表には測定値があります。各測定には、ソース(接頭辞+名前で識別される)とカテゴリがあります。各要素は、すべてのカテゴリで測定値を持つことができます。 ソースからの要素の最新の測定値を見つけて、要素+カテゴリの加重平均を計算します。 私の英語には申し訳ありませんが、私の主な言語ではありません:\ –
更新されました。最新のすべての測定でdate_updated *が*正確に等しくなっていますか?または、彼らは同じ日にちょうどですか? – Andomar
彼らは同じソースと要素の最新です。彼らは変わるかもしれません。 –