我将每个交易日的所有权益交易存储在表中。该表包含数百万行。由于在同一时间和第二次,可能有2个或更多的事务发生,并且源数据也没有任何主键。所以我没有添加任何主键到表中。但是做任何查询都很慢,大约60 - 120secs。如何加快SQL查询速度
这里的结构:MySQL和InnoDB的,utf8_general_ci
Ticker varchar(15)
ReleaseDT datetime
Order int(1)
Price decimal (7,3)
Volume bigint(13)
Amount bigint(13)
NoOfLot int(11)
Session varchar(3)
Source varchar(15)
TimeStamp timestamp
功能:
- 获得通过每天或整个一段时间的价格每个股票成交量。
- 查看每天有多少个买入和卖出股票的总量
- 进一步看点2,我会将它分为早上总买入量和早盘总卖量。
问题: 1.由于没有可找到的唯一项目,此表格的主键是否会影响查询速度?
我应该只添加一个像ID这样的auto_incremental#,它会自己创建吗?它对查询速度有帮助吗?
有些查询需要我60-120秒,任何方式来改善上述表?像索引?如果是,请告知如何。
我将使用php进行网络查询和输出,有时还会使用vb.net从mysql服务器进行查询。
例如:
select Ticker, ReleaseDT as 'Last Update',Price, convert(sum(case when iOrder = 1 then Amount else 0 end),decimal(9,0)) as TtlBuyAmt,
convert(sum(case when iOrder = -1 then Amount else 0 end),decimal(9,0)) as TTlSellAmt,
convert(sum(case when iOrder = 0 then Amount else 0 end),decimal(9,0)) as TTlUndetAmt,
convert(sum(case when iOrder = 1 then Amount else 0 end)/sum(case when iOrder = -1 then Amount else 0 end),decimal(9,0)) as TTlBuySellRatio,
sum(case when iOrder = 1 and Session = 'AM' then Amount else 0 end) as BuyAmtAM ,
SUM(CASE WHEN iOrder = 1 and Session = 'PM' then Amount else 0 end) as BuyAmtPM ,
SUM(CASE WHEN iOrder = -1 and Session = 'AM' then Amount else 0 end) as SellAmtAM,
SUM(CASE WHEN iOrder = -1 and Session = 'PM' then Amount else 0 end) as SellAmtPM ,
convert(SUM(CASE WHEN iOrder = -1 and Session = 'PM' then Amount else 0 end)/SUM(CASE WHEN iOrder = -1 and Session = 'AM' then Amount else 0 end),decimal(5,2)) as SellPMAMRatio,
sum(Amount) as TotalAmt,
convert(sum(case when iOrder = 1 then Amount else 0 end) - sum(case when iOrder = -1 then Amount else 0 end),decimal(9,0)) as NetAmount
FROM Trade
WHERE Ticker = '1 HK EQUITY' and DATE(ReleaseDT) between '20150102' and '20150104'
GROUP BY Ticker, date(ReleaseDT), Price
ORDER BY Ticker ASC, Price DESC
这需要> 60secs来运行,什么方法能改进?
SELECT * FROM AS2046.BlockTrade_EOD where Ticker = '1 HK EQUITY' and Date(ReleaseDT) > '20150102' Group by Price
使用EXPLAIN ...和结果如下:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'BlockTrade_EOD', 'ALL', NULL, NULL, NULL, NULL, '2327212', 'Using where; Using temporary; Using filesort'
请在您的问题中做一个'EXPLAIN SELECT [...]'EXPLAIN SELECT [...]并将结果发布到您的问题中。另外请从相关表格中发布完整的“CREATE TABLE”语句。 – Bjoern 2015-02-07 12:05:53
欢迎使用堆栈溢出。毫无疑问,索引将帮助您查询此表。为了帮助您,我们需要查看一些速度较慢的查询。请编辑您的问题以包含它们。同时,阅读**复合覆盖指标。**添加了 – 2015-02-07 12:35:26
。这是常用的sql查询之一。 – Trader 2015-02-07 12:57:21