【问题标题】:Large MySql table putting too much load on server大型 MySql 表对服务器造成过多负载
【发布时间】:2011-09-18 21:40:45
【问题描述】:

我有一个 MySql 表,其中包括:

  1. ~2500 万行(当前)
  2. 3 个索引
  3. 每天,爬虫会增加大约 300 万行
  4. 我目前并没有看得太远,但对 db 的最终估计可能是 ~CONST*e9 行
  5. 目前为 9.5giga
  6. innodb 并且在插入时正在读取它

数据本身由约 100 个字符的文本 + 几个包含元数据的字段组成。索引是唯一 ID、作者姓名和作者 ID。

到目前为止,一切都很顺利,但是现在服务器很难处理新数据的插入(每个插入大约 10 秒,增加了大约 3k 行)。我正在努力寻找解决这个问题的方法。我考虑的事情:

  1. 在插入时执行索引需要花费一些力气。也许在插入时不这样做,并且只有在 X 插入添加索引之后。
  2. 将数据分区到不同的表中。
  3. 爬入小数据库,每 X 分钟/天,将数据移动到大数据库。
  4. 移动到不同的数据库。我对 NoSql 不够熟悉,能帮我解决这些问题吗?用起来费劲吗?

每个选项都有其子选项和困境,但我认为我应该首先专注于有一个方向。我应该走哪条路线,为什么?有没有我应该考虑的不同道路?

顺便说一句 - 还有一个选项可以不保留所有数据,而只保留我真正显示的部分,但这将导致无法在数据显示之前进行的过程中进行一些功能更改。

【问题讨论】:

  • 数据是什么样的?和索引?
  • 更新了问题的答案。
  • innodb 还是 myisam?插入时该表是否用于读取查询?
  • @ggiroux 更新了问题:“innodb 并且在插入时正在读取它”
  • 服务器有多少内存,mysql允许使用多少?在这样大小的数据库上,我会检查各种缓存是否溢出,以至于 MySQL 必须更频繁地访问磁盘,这是一个巨大的减速(磁盘比 ram 慢许多数量级)。

标签: mysql database database-design indexing nosql


【解决方案1】:

如果您每天添加 3,000,000 行,而 3000 行需要 10 秒的事务,那么您说的是每天 1,000 次事务,这大约需要 170 分钟。这真的不算多。

我想我会先尝试

  1. 减少INSERT的数量 通过插入更多行来交易 每笔交易
  2. 调整服务器

您可能会发现在每个事务中插入更多行实际上花费的总时间更少。如果没有,很容易恢复。如果您先将行存储在其他位置,则可以在低负载期间运行 INSERT 事务。

无论如何,调整服务器可能是个好主意。如需参考,请参阅Tuning Server Parameters 上的 MySQL 文档。

【讨论】:

    【解决方案2】:

    当前引擎是否最适合使用?

    你考虑过http://dev.mysql.com/doc/refman/5.1/en/partitioning-management.html

    【讨论】:

    • 我没有。我认为这适合第 2 个选项。考虑到我的数字,这就足够了吗?
    • 数据的其他需求和用途以及密集程度如何?
    • 每次访问网站时都会从数据库中读取此数据。这是构建网站的主要数据
    • 你试过分区吗?它真的有帮助吗?该过程的任何指针?
    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多