【问题标题】:Best storage engine for constantly changing data不断变化的数据的最佳存储引擎
【发布时间】:2010-12-13 09:28:45
【问题描述】:

我目前有一个应用程序正在使用 130 个 MySQL 表,所有表都带有 MyISAM 存储引擎。每个表每秒都有多个查询,包括选择/插入/更新/删除查询,因此数据和索引不断变化。

我面临的问题是硬盘无法应对,I/O 访问的等待时间长达 6 秒以上,而 MySQL 完成了如此多的读/写操作。

我正在考虑更改为仅 1 个表并使其基于内存。不过,我从来没有将内存表用于有这么多查询的东西,所以我想知道是否有人可以就这是否是正确的做法给我任何反馈?

【问题讨论】:

  • 将所有表更改为基于内存的表并查看它如何影响性能应该不难。你试过了吗?

标签: mysql memory hard-drive myisam


【解决方案1】:

一种可能性是可能有其他问题导致性能问题 - 6 秒对于 CRUD 操作来说似乎太长了,即使在复杂的数据库上也是如此。请记住,(过去)ArsDigita 可以在具有相当适中的磁盘配置的双向 Sun Ultra 2 (IIRC) 上每秒处理 30 次点击。具有合理磁盘布局和适当调整的现代中低端服务器应该能够应对相当大的工作量。

  • 您是否缺少索引? - 检查慢速查询的查询计划以查找不应该进行的表扫描。

  • 服务器上的磁盘布局是什么? - 您是否需要升级硬件或修复一些磁盘配置问题(例如,磁盘不足、日志与数据在同一卷上)。

  • 正如另一张海报所暗示的,您可能希望在大量写入的表上使用 InnoDB。

  • 检查数据库服务器上的内存使用设置。您可能需要配置更多缓存。

编辑:数据库日志应该保存在它们自己的安静磁盘上。他们使用带有许多小顺序写入的顺序访问模式。当他们与数据文件等随机访问工作负载共享磁盘时,随机磁盘访问会在日志上造成很大的系统性能瓶颈。请注意,这是需要完成的写入流量(即写入物理磁盘),因此缓存对此无济于事。

【讨论】:

  • CPU 使用率约为 2%,内存使用 6GB 中的约 450MB。服务器上唯一的瓶颈是硬盘。服务器中有 2 个驱动器以 RAID-1(硬件 RAID 卡)运行,它们都是 10K RPM SCSI 驱动器。
  • 至少,数据库日志应该在物理上独立的磁盘上(见上文),因此您应该为日志添加另一个镜像对到服务器。您还可以检查您的查询计划,看看数据库是否在做一些愚蠢的事情或需要添加索引。
  • 数据库日志被禁用。我们将从 RAID 1 更改为 1+0,并在阵列中添加另外 2 个驱动器。我还将尝试将表上的主查询从“select id from table where status=1 order by rand() limit 1”更改为“select id from table where status=1 limit 1”。我将在今天晚些时候发布更改的结果。
  • 查看在(Status, ID)上放置索引是否有帮助(如果这样的索引尚不存在)
  • ID 为主键,状态为索引。我只是在等待硬盘驱动器,这样我就可以试用 RAID 10,可能要到明天才能试用。
【解决方案2】:

我现在已更改为 MEMORY 表,一切都好多了。事实上,我现在在服务器上有额外的备用资源,可以进一步扩展操作。

【讨论】:

    【解决方案3】:

    您不使用 innodb 是否有特定原因?由于缓存和不同的并发模型,它可能会产生更好的性能。它可能需要更多的调整,但可能会产生更好的结果。

    should-you-move-from-myisam-to-innodb

    【讨论】:

    • 我试过 InnoDB,它比 MyISAM 慢得多。使用 MyISAM 大约需要 0.2 秒的查询使用 InnoDB 大约需要 5 秒。
    【解决方案4】:

    我认为你的数据库结构非常错误,需要优化,与存储无关

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多