MySQL缓慢查询某些特定值(股票数据)

时间:2018-09-13 07:13:37

标签: mysql database performance stock-data

我有一些这样的库存数据

+--------+---------------+------+-----+---------+-------+
| 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年之后没有更多数据,“好”股票都具有直到昨天的数据,但是我不确定所有“坏”股票是否都具有这种特征。

1 个答案:

答案 0 :(得分:2)

首先,让我们缩小表的大小。这将有助于加快 some

  • decimal(20,4)占用10个字节。小数点左边有16个小数位。那多大的存货?我不知道一个需要超过6个。另一方面,右边4个就够了吗?
  • 规范化“代码”。可以用2个字节的SMALLINT UNSIGNED NOT NULL来表示“ 3000多种不同的股票”,而不是当前的7个字节。
  • '000029'出现ZEROFILL吗???
  • DESCRIBE的描述性不如SHOW CREATE TABLE。什么是PRIMARY KEY?在这种桌子上可以有很大的不同。
  • 请勿创建任何列NULL;让它们全部NOT NULL
  • 使用InnoDB和 do 具有明确的PRIMARY KEY

我希望它们是最佳的,但是为了确保这一点,我需要查看一些更典型的查询。

PRIMARY KEY(code, date)
INDEX(date)