4

次のMySql更新状態は、提供されたレコードセット(〜5000レコード)の実行に過度の時間がかかるようです。以下の更新ステートメントの実行には、平均12秒かかります。私は現在、この計算を5つの異なる期間と約500の異なる銘柄記号に対して実行することを計画しています。これは、12秒*5回の計算*500シンボル=30,000秒または8..33時間に変換されます。

更新ステートメント:

UPDATE tblStockDataMovingAverages_AAPL JOIN 
(SELECT t1.Sequence,
   (
    SELECT AVG(t2.Close)
        FROM tblStockDataMovingAverages_AAPL AS t2
        WHERE (t1.Sequence - t2.Sequence)BETWEEN 0 AND 7
    )AS "8SMA" 
FROM tblStockDataMovingAverages_AAPL AS t1 
ORDER BY t1.Sequence) AS ma_query 
ON tblStockDataMovingAverages_AAPL.Sequence = ma_query.Sequence  
SET tblStockDataMovingAverages_AAPL.8MA_Price = ma_query.8SMA

テーブルデザイン:

CREATE TABLE `tblStockDataMovingAverages_AAPL` (
  `Symbol` char(6) NOT NULL DEFAULT '',
  `TradeDate` date NOT NULL DEFAULT '0000-00-00',
  `Sequence` int(11) DEFAULT NULL,
  `Close` decimal(18,5) DEFAULT NULL,
  `200MA_Price` decimal(18,5) DEFAULT NULL,
  `100MA_Price` decimal(18,5) DEFAULT NULL,
  `50MA_Price` decimal(18,5) DEFAULT NULL,
  `20MA_Price` decimal(18,5) DEFAULT NULL,
  `8MA_Price` decimal(18,5) DEFAULT NULL,
  `50_200_Cross` int(5) DEFAULT NULL,
  PRIMARY KEY (`Symbol`,`Sequence`),
  KEY `idxSequnce` (`Sequence`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$

プロセスをスピードアップするための助けをいただければ幸いです。

Select Explainの出力:

id  select_type         table   type    possible_keys   key                 key_len ref     rows    Extra
1   PRIMARY             t1      index   NULL            idxSymbol_Sequnce   11      NULL    5205    Using index; Using filesort
2   DEPENDENT SUBQUERY  t2      ALL     NULL            NULL                NULL    NULL    5271    Using where
4

2 に答える 2

1

フィールドにインデックスを追加することで、わずかに最適化できCloseます。AVG機能はより効果的でなければなりません。データセットのダンプを共有して、詳細を確認してください。

于 2012-12-08T19:48:51.707 に答える
1

これはもう少し良いはずです:

update tblStockDataMovingAverages_AAPL
join (
  select t1.sequence as sequence, avg(t2.close) as av
  from tblStockDataMovingAverages_AAPL t1
  join tblStockDataMovingAverages_AAPL t2
  on t2.sequence BETWEEN t1.sequence-7 AND t1.sequence
  group by t1.sequence
) t1 on tblStockDataMovingAverages_AAPL.sequence = t1.sequence
set 8MA_Price = t1.av

BETWEEN私の声明に関して:条件field1 OPERATOR expression(field2)よりも最適化する方が簡単expression(field1, field2) OPERATOR expressionですON。これは当てはまると思いますBETWEEN

クエリ内のは不要のようORDER BYです。削除すると、クエリが大幅に高速化される可能性があります。

いずれかの銘柄記号が同じテーブルに表示されている場合は、これらすべてを1つの更新クエリに貼り付けます(ただし、異なる期間は機能しません)。これは、それぞれに対して実行するよりもはるかに高速です。

すでに提案したように、にインデックスを追加するとClose役立つ場合があります。

于 2013-01-09T17:21:28.527 に答える