我在本地计算机上建立了一个 mysql 表来存储股市数据。表名是minute_data
,结构很简单:
您可以看到我将键列设置为 date 和 symbol -> 的组合concat(date,symbol)
。这样我就insert ignore ...
可以在不复制日期/符号组合的情况下进行查询以将数据添加到表中。
有了这张表,数据检索就很简单了。假设我想获取 symbol 的所有数据CSCO
,那么我可以简单地执行以下查询:
select * from minute_data where symbol = "CSCO" order by date;
一切都在“工作”。该表现在包含来自 1000 多个符号的数据,已经超过 2200 万行。我认为所有 1000 个符号甚至还没有半满,所以我期待继续增加表格的大小。
查询此表时,我开始看到严重的性能问题。例如,下面的查询(我经常想做,查看特定交易品种的最新日期)需要超过 1 分钟才能完成,并且只返回 1 行!
select * from minute_data where symbol = "CSCO" order by date desc limit 1;
这个查询(也很重要)平均也需要超过 1 分钟:
select count(*), symbol from minute_data group by symbol;
性能问题使得继续以这种方式处理数据变得不切实际。这些是我想向社区提出的问题:
继续将我的数据集构建到这个表中是徒劳的吗?
对于这样的数据集,MySQL 完全不是一个糟糕的选择吗?
我可以对这张表做些什么来提高性能?
为此我应该使用什么样的数据结构(而不是 MySQL 表)?
谢谢你!
更新
我提供来自 的输出explain
,与以下 2 个查询相同:
explain select count(*), symbol from minute_data group by symbol;
explain select * from minute_data where symbol = "CSCO" order by date desc limit 1;
更新 2
很简单的修复。我执行了这个查询来删除key_col
我上面定义的无用的,并在 2 列上创建了一个主键:日期和符号:
alter table minute_data 删除主键,添加主键(日期,符号);
现在我尝试了以下查询,不到 1 秒就完成了:
select * from minute_data where symbol = "CSCO" order by date desc limit 1;
此查询仍然需要很长时间才能完成(72 秒)。我想这仍然是因为查询必须在一个查询中列出所有 2200 万行?:
select count(*), symbol from minute_data group by symbol;