[前][次][番号順一覧][スレッド一覧]

mysql:16325

From: HIRATSUKA Sadao <HIRATSUKA Sadao <sh2@xxxxxxxxxx>>
Date: Sat, 30 Apr 2016 00:13:40 +0900
Subject: [mysql 16325] Re: [mysql 16324] 処理速度が遅い

ユメ吉さん
こんばんは、平塚といいます。

なんとなくですが、株式などの市場データでしょうか。
数値1が最高値、数値2が最安値、それで直近1週間、1か月、
半年(180日ではなくて?)、1年の移動平均を出したい、
ということでイメージ合うでしょうか。

この、移動平均をかなりの力技で計算しているので、
MySQL的につらいことになっていると思われます。

EXPLAINを見てインデックスを追加するというMySQLの技術力よりも、
RDBMSで移動平均をどうやって計算すればよいのだろう、
といったところに工夫が求められる感じです。

それから、
過去にさかのぼって数値1、数値2が変化することはありますか?
もし市場データでしたら過去のデータは変わらないですよね。

4か月分の計算に96分かかったのことですが、前日までのデータは
1回計算すればそれを記録しておけばよい、といったことはないでしょうか。

昨日までのデータがすでに計算してあるのならば、
今日の分を9.6秒かけて計算して、末尾に追加するだけ、
といった運用ができるかもしれませんね。

とはいえMySQLの技術力でどうにかねじ伏せられるかどうかについては
思いついたらメールしてみようと思います。
#今日は思いつきませんでした(^^;

2016年4月29日 23:28 ユメ吉 <yume_tana@xxxxxxxxxx>:
> MySQLをはじめて1ヶ月の初心者です。以前、他のRDBを少しかじった程度ですが

> 本格的にものにしようと勉強中です。

> ところが、MySQLの処理速度が遅いので困惑しており、メールをしたところです。

>

> テーブルは日付、 keycode、数値1、数値2と簡単ですが、データ量は毎日取込んでおりで

>  keycodeが2000種程になるので今では200万件を超えております。

> 今回MySQLに移植しなおして、ためしにselect * from テーブル名(tb)de開けたところ3.2秒かかりました。

> まだインデックスは付けていませんが、 keycodeだけ付けましたが2.2秒とあまり変わりません。

> その時、EXPLAINを見ましたが type = ALL  Key=NULL Extra = NULL  になっていました。

> 今回は自己結合を使って日付、 keycodeごとに1週間分、1か月分、半年分、一年分の平均を算出していきたく

> クエリーを作りました。 A.日付  >=  '2016-04-29' にして直近だけで9.6秒かかりました。

> ちなみに今年から(A.日付  >=  '2016-01-01' )では 96分かかっていました。本当は2年分程を5〜6分以内に

> できないか思っております。

> この時の条件は 日付とkeycodeを単独でインデックスを作りました。

> explain は tb A  type = range ,key=日付    ,extra =Using index condition; Using

> MRR; Using temporary; Using filesort

>            tb B  type = ref   ,key=keycode ,extra =Using where

> MYSQLのVer=5.7  モメリー=4G  OS=WIN7pro

> explainは初めてで良くわかりませんが、速度アップのためのご指導頂けないでしょうか。

> ***************************************************************

> select

>    A.hizuke         as   "HIZUKE"  ,

>    A.keycode        as   "KEYCODE",

>   avg(case when  B.日付 >= date_add(A.日付,interval -7 day)  then  B.数値1   else

> null end )  as  "7d_1_HEIKIN"  ,

>   avg(case when  B.日付 >= date_add(A.日付,interval -7 day)  then  B.数値2   else

> null end )  as  "7d_2_HEIKIN"  ,

>   avg(case when  B.日付 >= date_add(A.日付,interval -31 day) then  B.数値1   else

> null end )  as  "31d_1_HEIKIN"  ,

>   avg(case when  B.日付 >= date_add(A.日付,interval -31 day) then  B.数値2   else

> null end )  as  "31d_2_HEIKIN"  ,

>   avg(case when  B.日付 >= date_add(A.日付,interval -150 day) then  B.数値1   else

> null end )  as  "180d_1_HEIKIN"  ,

>   avg(case when  B.日付 >= date_add(A.日付,interval -150 day) then  B.数値2   else

> null end )  as  "180d_2_HEIKIN"  ,

>   avg(case when  B.日付 >=  date_add(A.日付,interval -365 day) then  B.数値1

> else null end )  as  "365d_1_HEIKIN"  ,

>   avg(case when  B.日付 >=  date_add(A.日付,interval -365 day)  then  B.数値2

> else null end )  as  "365d_2_HEIKIN"  ,

>   from   tb A , tb B

>

>  where  A.keycode   =  B.keycode

>  and    A.日付  >=  '2016-04-29'

>  and    B.日付  between    date_add(A.日付,interval -365 day)   and   A.日付

>

>  group by  A.keycode ,A.日付

>

> ******************************************************************




-- 
平塚貞夫 <sh2@xxxxxxxxxx>

[前][次][番号順一覧][スレッド一覧]

   @ 16324 2016-04-29 23:28 [ユメ吉 <yume_tana@xx] 処理速度が遅い                          
->   16325 2016-04-30 00:13 ┗[HIRATSUKA Sadao <sh2] Re: [mysql 16324] 処理速度が遅い      
   @ 16326 2016-04-30 10:39  ┗[Masaki Miyata <catlo] Re: [mysql 16325] Re: [mysql 16324] 処理速度が遅い
   @ 16327 2016-04-30 14:10   ┗["yoku ts." <yoku0825] Re: [mysql 16326] Re: [mysql 16325] Re: [mysql 16324] 処理速度が遅い
   @ 16328 2016-05-01 09:25    ┗[Masaki Miyata <catlo] Re: [mysql 16327] Re: [mysql 16326] Re: [mysql 16325] Re: [mysql 16324] 処理速度が遅い
   @ 16329 2016-05-01 11:50     ┗[ユメ吉 <yume_tana@xx] Re: [mysql 16328] Re: [mysql 16327] Re: [mysql 16326] Re: [mysql 16325] Re: [mysql 16324] 処理速度が遅い