1

我在本地计算机上建立了一个 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;
4

1 回答 1

1

你的 key_col 完全没用。你知道你可以在多列上有一个主键吗?我建议您删除该列并按此顺序在(日期,符号)上创建一个新的主键,因为您的日期列具有更高的基数。此外,您可以(如果需要)在(符号、日期)上创建另一个唯一索引。发布EXPLAIN您最重要的查询。的基数是symbol多少?

更新:

您在说明中看到的是,没有可以使用的索引,它扫描了整个 2250 万行。请尝试使用上述方法。如果您现在不想删除 key_col,您至少应该在符号列上添加一个索引。

于 2013-03-25T10:24:50.827 回答