0

私はテーブル IntradayPrices1Minute を持っており、ここに 1 分間の時間枠で株の始値、高値、安値、終値を保存しています。

CREATE TABLE `IntradayPrices1Minute` (
  `ticker` varchar(10) NOT NULL DEFAULT '',
  `datetime` datetime NOT NULL,
  `volume` mediumint(11) unsigned NOT NULL,
  `open` decimal(8,4) unsigned NOT NULL,
  `high` decimal(8,4) unsigned NOT NULL,
  `low` decimal(8,4) unsigned NOT NULL,
  `close` decimal(8,4) unsigned NOT NULL,
  PRIMARY KEY (`ticker`,`datetime`),
  UNIQUE KEY `indxTickerDatetime` (`ticker`,`datetime`)
)

これらの株の毎日の始値、高値、安値、終値を計算できるクエリを作成しました。これはクエリです:

select 
    `IntradayPrices1Minute`.`ticker` AS `ticker`,
    cast(`IntradayPrices1Minute`.`datetime` as date) AS `Date`,
    substring_index(group_concat(cast(`IntradayPrices1Minute`.`open` as char charset utf8) order by `IntradayPrices1Minute`.`datetime` ASC separator ','),',',1) AS `Daily Open`,
    max(greatest(`IntradayPrices1Minute`.`open`,`IntradayPrices1Minute`.`high`,`IntradayPrices1Minute`.`low`,`IntradayPrices1Minute`.`close`)) AS `Daily High`,
    min(least(`IntradayPrices1Minute`.`open`,`IntradayPrices1Minute`.`high`,`IntradayPrices1Minute`.`low`,`IntradayPrices1Minute`.`close`)) AS `Daily Low`,
    substring_index(group_concat(cast(`IntradayPrices1Minute`.`close` as char charset utf8) 

order by 
   `IntradayPrices1Minute`.`datetime` DESC separator ','),',',1) AS `Daily Close` 
from    
   `IntradayPrices1Minute` 

group by 
   `IntradayPrices1Minute`.`ticker`,
   cast(`IntradayPrices1Minute`.`datetime` as date)

これは、4 ~ 5 日分のデータしかなかったときに得た結果の一部です (現在、さらに多くの日数のデータがあります)。

ticker  Date        Open    High    Low     Close
----    ----------  ------  ------  ------  ------ 
AAAE    2012-11-26  0.0100  0.0100  0.0100  0.0100
AAAE    2012-11-27  0.0130  0.0140  0.0083  0.0140
AAAE    2012-11-28  0.0140  0.0175  0.0140  0.0165
AAAE    2012-11-29  0.0175  0.0175  0.0137  0.0137
AAMRQ   2012-11-26  0.4411  0.5300  0.4411  0.5290
AAMRQ   2012-11-27  0.5100  0.5110  0.4610  0.4950
AAMRQ   2012-11-28  0.4820  0.4900  0.4300  0.4640
AAMRQ   2012-11-29  0.4505  0.4590  0.4411  0.4590
AAMRQ   2012-11-30  0.4500  0.4570  0.4455  0.4568

そのため、今日の時点で、IntradayPrices1Minuteテーブルにはすでに9625952レコードがあり、約 2 倍に増えています。毎日 350000 レコード

以前の SELECT を LIMIT 1000 で実行すると、すでに 8 秒以上かかるため、いくつかのインデックスが必要であることがわかりましたが、インデックスとその決定方法に関する私の知識は非常に限られています。

これについてより専門的な知識をお持ちの方には、役立つと思われる情報がいくつかあります。

show indexes from IntradayPrices1Minute

戻り値:

IntradayPrices1Minute   0   PRIMARY 1   ticker  A   32368               BTREE       
IntradayPrices1Minute   0   PRIMARY 2   datetime    A   9872508             BTREE       
IntradayPrices1Minute   0   indxTickerDatetime  1   ticker  A   21793               BTREE       
IntradayPrices1Minute   0   indxTickerDatetime  2   datetime    A   9872508             BTREE       

show profiling コマンドは次のように表示します。

Status                 Duration
------                 --------
starting               0.000055
checking permission    0.000003
Opening tables         0.000018
System lock            0.000005
init                   0.000022
optimizing             0.000004
statistics             0.000011
preparing              0.000006
executing              0.000027
Sorting result         8.533655
Sending data           0.233446
end                    0.000010
removing tmp table     0.000006
end                    0.000007
removing tmp table     0.000002
end                    0.000005
query end              0.000003
closing tables         0.000004
freeing items          0.000041
logging slow query     0.000002
cleaning up            0.000003

残念ながら、私の知識が限られているため、この情報はあまり役に立ちません。ショーのプロファイリングでは、「ソート結果」に 8,53 秒が使用されていることが示されているため、これらすべての ORDER BY が非常に集中していると思われますが、クエリを効率的にするためにこれにアプローチする方法がわかりません。

特に、トラブルシューティングが必要になる可能性のある将来のクエリのより良いインデックス作成を理解するのに役立つ場合は、ご意見をお寄せいただきありがとうございます。

乾杯、ボガ

4

1 に答える 1

2

変更してみる

GROUP BY ticker, date(datetime)

の中へ

GROUP BY ticker, datetime

1 つ目はインデックスを使用していないため、(非常に遅い) ファイル ソートが必要です。2 つ目はインデックスを使用する方法で、はるかに高速です。

このような問題は、次を使用して見つけることができます。

EXPLAIN SELECT * FROM table
于 2013-01-25T10:59:50.210 に答える