【问题标题】:Huge MySQL Database -- Do's and Don'ts?庞大的 MySQL 数据库——该做什么和不该做什么?
【发布时间】:2011-02-11 19:15:57
【问题描述】:

我有兴趣使用 MySQL 构建一个巨大的数据库(1 亿条记录),以 1 分钟的间隔包含股票数据。该数据库将包含 5000 只股票的数据,比如 10 年。

两个问题:

(1) 过去,我有一个“插入慢”的问题——意思是,一开始插入的速度很好,但是随着表被数百万条记录填满,插入变得很慢(太慢了!)。那时我用的是 Windows,现在我用的是 Linux——应该会有所不同吗?

(2) 我知道索引技术可以帮助查询(数据检索)更快。问题是,有没有办法加快插入速度?我知道可以在插入时关闭索引,但是在插入后“构建”索引(用于数千万条记录!)也需要大量时间。有什么建议吗?

还有其他注意事项吗?提前感谢您的帮助。

【问题讨论】:

  • 您需要什么插入率?一般来说,大型数据集需要大量内存来进行快速操作,以便所有索引都可以一直保存在内存中。我在 ms sql server 中有一个包含 3.5 亿行的表,没有插入问题,但我们最多每秒只插入大约 100 行,以及大致相同数量的更新和选择。
  • 另外我们使用 48 Gigabyes 内存来确保索引在内存中,表上的索引超过 24 GB ;)
  • 谢谢大卫——这很有帮助。
  • @user54009 只是好奇,这些数据是免费提供的吗?如果是的话,从哪里可以得到它?

标签: mysql database linux ubuntu


【解决方案1】:

这取决于您需要什么类型的索引以及如何生成数据。如果您对单个索引按时满意,请坚持下去,当您生成数据时,继续按升序插入(相对于您拥有索引的插入时间)。这样,在插入过程中所需的重新排序是最小的。此外,考虑分区以优化您的查询。它可以使您的性能得到显着提高。使用自增列有助于快速建立索引,但如果自增列是唯一索引,您将无法按时获得索引。确保使用 innodb 存储引擎以获得良好的性能。如果您在 Linux 上正确调整数据库引擎并保持设计简单,它将顺利扩展而不会出现太多问题。我认为您所说的庞大数据需求并不像最初看起来那样难以构建。但是,如果您计划运行聚合查询(使用表连接),那将更具挑战性。

【讨论】:

  • 谢谢塔瓦。假设一个人正在处理许多具有时间戳的记录,插入许多具有时间戳的记录(例如)2001 年 - 2010 年。如何“按顺序”插入具有(例如)2006 年时间戳的新记录?跨度>
【解决方案2】:

您始终可以将数据保存在没有索引的表中,然后使用 Lucene(或类似软件)为数据编制索引。这将保持快速插入,并允许您查询 Lucene 以进行快速数据检索。

【讨论】:

  • 谢谢。 Lucene 索引是否比 MySQL 索引更快/更好?
  • 一般来说,当提问者有特定的想法时,推荐另一种产品/解决方案不是一个好习惯。这是为了帮助回答提问者实际提出的问题。这也有助于避免“忘记 ABC,改用 XYZ!”的战争。发生。
  • @user3262424 使用 Lucene 或 ElasticSearch 之类的东西的好处是它们可以扩展,而 mysql 索引仅限于磁盘上的文件,该文件必须适合 RAM。建议不是替换 MySQL,而是增强其相当有限的索引能力。
【解决方案3】:

考虑使用 SSD 驱动器(或阵列)来存储您的数据,尤其是当您负担不起创建具有千兆内存的盒子时。它的一切都应该更快。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 2013-01-02
    相关资源
    最近更新 更多