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

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

最佳答案

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

  • decimal(20,4) 占用 10 个字节。小数点左边有16位小数;什么股票这么大?我不知道哪个需要超过 6 个。另一方面,右边的 4 个够吗?
  • 标准化“代码”。 “3000+不同股票”可以用 2 字节 SMALLINT UNSIGNED NOT NULL 表示,而不是当前的约 7 个字节。
  • “000029”有点ZEROFILL??
  • DESCRIBE 不像 SHOW CREATE TABLE 那样具有描述性。什么是主键?它可以在这种 table 上产生很大的变化。
  • 不要将任何列设为NULL;使它们全部为NOT NULL
  • 使用 InnoDB 并且确实有明确的主键

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

PRIMARY KEY(code, date)
INDEX(date)

关于MySQL对某些特定值的慢查询(股票数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52308400/

相关文章:

mysql - 通过VB.NET向mySQL传输数据

MySQL Join 与可选的选择值

php - 在文本框中输入时不显示自动完成功能,但值显示在控制台中

mysql - 在 MySQL Workbench 中导出数据库

PHP MySQL INSERT 值返回插入的主键

ruby-on-rails - Rails - Postgres - 无法连接到服务器:连接被拒绝 (PG::ConnectionBad)

database - 什么是 clojure 中用于逻辑编程的好的/已建立的数据库支持策略

java - Assets +skipBytes性能

java - 异步日志记录的多线程与 JMS 队列

performance - 计算平方根的速度有多慢(多少个周期)?