mysql慢速查询,带有一些特定值(股票数据)

omvjsjqw  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(265)

我有一些这样的股票数据

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

zazmityj

zazmityj1#

首先,让我们缩小table的尺寸。这将有助于加快速度。 decimal(20,4) 需要10个字节。小数点左边有16位小数位;什么股票那么大?我不知道一个人需要超过6个。另一方面,右边的4够吗?
规范‘代码’。”3000多只不同的股票”可以用2字节表示 SMALLINT UNSIGNED NOT NULL ,而不是当前的~7字节。
“000029”有点 ZEROFILL ?? DESCRIBE 并不像 SHOW CREATE TABLE . 什么是 PRIMARY KEY ? 在这种table上会有很大的不同。
不要做任何列 NULL ; 把它们都做出来 NOT NULL .
使用innodb,并且有一个显式的 PRIMARY KEY .
我希望这些查询是最佳的,但我需要看到一些更典型的查询才能确定。

PRIMARY KEY(code, date)
INDEX(date)

相关问题