私はテーブル 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 が非常に集中していると思われますが、クエリを効率的にするためにこれにアプローチする方法がわかりません。
特に、トラブルシューティングが必要になる可能性のある将来のクエリのより良いインデックス作成を理解するのに役立つ場合は、ご意見をお寄せいただきありがとうございます。
乾杯、ボガ