如何设计一个数据库/表,每分钟增加很多行

时间:2018-09-01 14:22:06

标签: mysql database-design query-optimization

我处于需要每分钟存储1900多种加密货币的数据的情况,我使用MySQL innoDB。

当前,表格看起来像这样

coins_minute_id | coins_minute_coin_fk | coins_minute_usd | coins_minute_btc | coins_minute_datetime | coins_minute_timestamp

coins_minute_id = autoincrement id
coins_minute_coin_fk  = medium int unsigned
coins_minute_usd  = decimal 20,6
coins_minute_btc = decimal 20,8
coins_minute_datetime = datetime
coins_minute_timestamp = timestamp

该表在短时间内迅速增长,每分钟向该表添加1900+行。

数据将以D3.js折线图的形式用于每种加密货币的历史价格显示。

我的问题是我如何最好地优化该数据库,我曾想过只每5分钟而不是1分钟收集一次数据,但是它仍然会立即合计很多数据,我还想过最好为每种加密货币创建一个唯一的表,喜欢设计数据库的任何人是否都知道其他一些非常聪明和聪明的方法来进行类似的事情?

亲切的问候

(来自评论)

SELECT  coins_minute_coin_fk, coins_minute_usd
    FROM  coins_minutes
    WHERE  coins_minute_datetime >= DATE_ADD(NOW(),INTERVAL -1 DAY)
      AND  coins_minute_coin_fk <= 1000
    ORDER BY  coins_minute_coin_fk ASC

1 个答案:

答案 0 :(得分:0)

  • 摆脱coins_minute_前缀;它使SQL混乱而没有提供任何有用的信息。
  • 不要两次指定时间-有一些简单的函数可以在DATETIMETIMESTAMP之间进行转换。为什么同时创建和更新了时间戳?您在做UPDATE语句吗?如果是这样,那么代码比简单的“插入”要复杂得多。而且您需要一个唯一的密钥才能知道要更新的行。
  • 提供SHOW CREATE TABLE;您提供的内容更具描述性。
  • 每秒30次插入很容易。 300 /秒可能有问题。
  • 不要PARTITION在没有任何真正理由的情况下这样做。 valid 的常见原因是您要定期删除“旧”数据。如果您要在3个月后删除,我将使用PARTITION BY RANGE(TO_DAYS(...))构建表并使用每周分区。更多讨论:http://mysql.rjweb.org/doc.php/partitionmaint
  • 向我们显示查询。如果不知道如何访问架构,则无法对其进行优化。
  • “批”插入比单行INSERT语句快得多。可以采用INSERT INTO x (a,b) VALUES (1,2), (11,22), ...LOAD DATA INFILE的形式。如果您已经有CSV文件,则后者非常好。
  • 您的数据是否来自单一来源?还是1900种不同的来源?
  • MySQL和MariaDB在您的任务上可能完全相同。 (同样,需要查看查询)。无需重新编码。
  • 看到查询后,我们可以讨论拥有什么PRIMARY KEY和拥有什么次要INDEX(es)
  • 1分钟vs 5分钟?您是说在后一种情况下只收集五分之一的行吗?剩下的细节出来后,我们可以讨论这个问题。
  • 该查询没有多种含义。为什么停在“ 1000”?输出很大;什么客户关心那么多数据?顺序是不确定的-不保证日期时间是正确的。为什么不指定日期时间而指定美元?请提供理由查询;那么我可以帮助您INDEX(es)