mysql - 优化和/或重新架构大型 MySQL 表的建议

标签 mysql performance optimization

我有一张表,已经达到了近300万条记录。虽然我知道这个数量相对于 RDBMS 来说可能不算大,但我注意到处理该表的操作速度变慢。我觉得我可以优化或重新架构它。

这是 PocketBracket March Madness App 数据库的一部分。本质上,该表存储一对多关系的元数据(括号有许多括号选择)。不同的是,桌面上的需求有时会有所不同。例如,表在短时间内(两周)主要执行写入操作。但在今年剩下的时间里,大部分时间都是在阅读。此外,绝大多数记录都没有被访问。

这是当前结构的屏幕截图:

enter image description here

因此,以下是我的一些想法:

  • 记录放在单独的表中。减少记录数量,但需要修改代码。
  • 对表进行非规范化,使模型为 1-1(即将所有括号选择压缩为单个序列化列)。减少记录数量,但需要修改代码。
  • 在需求期间(即 InnoDB/MyISAM)交换表的引擎和/或索引。
  • 我没想到的事情......

非常感谢您的指导。最后,我对代码更改感到满意,我只是想确保我朝着正确的方向重新构建。

最佳答案

在疯狂进行“优化”(例如分区、分片、非规范化等)之前...这会带来很多额外的问题,我首先会尝试检测导致速度变慢的原因。

举个例子,我有一个大约有 3000 万条记录的表,我每秒执行大量插入和读取操作,并且我可以在不到 300 毫秒的时间内获得大约 2000 条记录的查询结果。 (仍然可以改进)

此外,请记住,当您可以在多个磁盘之间拆分文件时,分区就很有意义,因此可以增加总体 I/O。因此,换句话说,您需要每个磁盘都有一个分区文件才能获得良好的性能。

因此,首先了解更多信息非常重要

  • 服务器内存数量
  • 服务器磁盘类型
  • 有 RAID 吗?如果是的话是哪一个?
  • 是否是虚拟服务器
  • mysql 每秒处理多少个查询?

这可能只是因为表只是碎片,并且 mysql 配置需要更多调整。 首先,您应该切换到 innodb,就像 Vyktor 建议的那样,然后您还必须将 innod db 缓冲区配置为更高的值。默认值太低。 这是我的配置文件的示例。请记住,参数是根据我的数据类型、查询和服务器规范进行调整的。另外,我正在使用 MySQL 的一个变体,名为 percona ,这也可以帮助您,因为事实证明它更快。在该网站上您可以找到一些基准。

innodb_file_per_table  
innodb_file_format=barracuda

innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size = 3GB
query_cache_size = 98304
innodb_log_file_size = 10485760
innodb_log_buffer_size = 3145728

我也会尝试运行 mysqlcheck警告!!!它锁定了表!

如果您需要有关 mysql 调优的更多信息,这是一个很棒的 blog

关于mysql - 优化和/或重新架构大型 MySQL 表的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9216134/

相关文章:

mysql - 大查询 SQL。合并具有相同列的表(无 PK)

c++ - std::set 为什么比 std::map 慢?

performance - 分支错误预测在哈希表查找性能中起什么作用?

MySql 错误 1064 - 使用 MySQL WorkBench 创建

MySQL 连接和安全

php - 遍历 mysql 结果并在解析为 json 之前将函数应用于每一行

performance - Pointfree 版本使性能恶化

android - Android 上的 PublisherAdView loadAd 性能问题

mysql - 在 MySQL 表中存储重复数据

c# - 在 C# 中,引用数组变量是否更慢?