我有一张表,已经达到了近300万条记录。虽然我知道这个数量相对于 RDBMS 来说可能不算大,但我注意到处理该表的操作速度变慢。我觉得我可以优化或重新架构它。
这是 PocketBracket March Madness App 数据库的一部分。本质上,该表存储一对多关系的元数据(括号有许多括号选择)。不同的是,桌面上的需求有时会有所不同。例如,表在短时间内(两周)主要执行写入操作。但在今年剩下的时间里,大部分时间都是在阅读。此外,绝大多数记录都没有被访问。
这是当前结构的屏幕截图:
因此,以下是我的一些想法:
- 将旧记录放在单独的表中。减少记录数量,但需要修改代码。
- 对表进行非规范化,使模型为 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/