2

我有一些这样的股票数据

+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| date   | datetime      | YES  | MUL | NULL    |       |
| open   | decimal(20,4) | YES  |     | NULL    |       |
| close  | decimal(20,4) | YES  |     | NULL    |       |
| high   | decimal(20,4) | YES  |     | NULL    |       |
| low    | decimal(20,4) | YES  |     | NULL    |       |
| volume | decimal(20,4) | YES  |     | NULL    |       |
| code   | varchar(6)    | YES  | MUL | NULL    |       |
+--------+---------------+------+-----+---------+-------+

具有三个索引,日期和代码的多列索引,日期索引和代码索引。

表很大,有3000+个不同的股票,每只股票都有近十年的分钟数据。

我想获取特定股票的最后日期,所以我运行以下 sql:

SELECT date FROM tablename WHERE code = '000001' ORDER BY date DESC LIMIT 1;

但是,此查询对大多数股票(<1 秒)效果很好,但对某些特定股票(>1 小时)的性能很差。例如,只需将查询更改为

SELECT date FROM tablename WHERE code = '000029' ORDER BY date DESC LIMIT 1;

它似乎永远冻结了。

我知道的一件事是,股票“000029”在2016年之后没有更多数据,而“好”的股票直到昨天都有数据,但我不确定是否所有的“坏”股票都有这个特征。

4

1 回答 1

2

首先,让我们缩小表格大小。这将有助于加快一些.

  • decimal(20,4)占用 10 个字节。小数点左边有 16 位小数;什么股票这么大?我不知道一个需要超过 6 个。另一方面,右边的 4 个足够吗?
  • 规范化“代码”。“3000+ 不同的股票”可以用 2 字节表示SMALLINT UNSIGNED NOT NULL,而不是当前的 ~7 字节。
  • '000029' 的味道ZEROFILL??
  • DESCRIBE不像SHOW CREATE TABLE. 是什么PRIMARY KEY?它可以在这种表中产生很大的不同。
  • 不要做任何列NULL;让他们全部NOT NULL
  • 使用 InnoDB 并且确实有一个明确的PRIMARY KEY.

我希望这些是最佳的,但我需要查看一些更典型的查询才能确定。

PRIMARY KEY(code, date)
INDEX(date)
于 2018-09-30T02:48:12.257 回答