我有一些这样的库存数据
+--------+---------------+------+-----+---------+-------+
| 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年之后没有更多数据,“好”股票都具有直到昨天的数据,但是我不确定所有“坏”股票是否都具有这种特征。
答案 0 :(得分:2)
首先,让我们缩小表的大小。这将有助于加快 some 。
decimal(20,4)
占用10个字节。小数点左边有16个小数位。那多大的存货?我不知道一个需要超过6个。另一方面,右边4个就够了吗?SMALLINT UNSIGNED NOT NULL
来表示“ 3000多种不同的股票”,而不是当前的7个字节。ZEROFILL
吗??? DESCRIBE
的描述性不如SHOW CREATE TABLE
。什么是PRIMARY KEY
?在这种桌子上可以有很大的不同。NULL
;让它们全部NOT NULL
。PRIMARY KEY
。我希望它们是最佳的,但是为了确保这一点,我需要查看一些更典型的查询。
PRIMARY KEY(code, date)
INDEX(date)