优化和/或重新构建大型MySQL表的建议
我有一个表,已经达到近300万条记录。虽然我知道相对于RDBMS,这个数量可能不算大,但我注意到处理这个表的操作速度变慢了。我觉得我可以优化或重新构建它 这是的数据库的一部分。本质上,该表存储一对多关系的元数据(括号中有许多括号)。问题在于,桌上的需求有时是不同的。例如,有一段很短的时间(两周),表主要执行写操作。但在今年余下的时间里,它主要是阅读。此外,绝大多数记录都无法访问 以下是当前结构的屏幕截图: 有了这些,我有一些想法:优化和/或重新构建大型MySQL表的建议,mysql,performance,optimization,Mysql,Performance,Optimization,我有一个表,已经达到近300万条记录。虽然我知道相对于RDBMS,这个数量可能不算大,但我注意到处理这个表的操作速度变慢了。我觉得我可以优化或重新构建它 这是的数据库的一部分。本质上,该表存储一对多关系的元数据(括号中有许多括号)。问题在于,桌上的需求有时是不同的。例如,有一段很短的时间(两周),表主要执行写操作。但在今年余下的时间里,它主要是阅读。此外,绝大多数记录都无法访问 以下是当前结构的屏幕截图: 有了这些,我有一些想法: 将旧记录放在单独的表中。减少记录的数量,但需要修改代码 对表
- 将旧记录放在单独的表中。减少记录的数量,但需要修改代码
- 对表格进行非规范化,使模型为1-1(即,将所有括号选取压缩为单个序列化列)。减少记录的数量,但需要修改代码
- 在需求期间交换表的引擎和/或索引(即InnoDB/MyISAM)
- 一些我没有想到的事情
- 4个插座,共48芯,4 x 12芯AMD Opteron 6172“Magny Cours”2.1GHz CPU。(注:36个内核分配给MySQL和 剩下的12个步骤(由Sysbench处理)
- 64 GB DDR3 RAM
- 2个Intel X25E SSD驱动器
- 无R-树
- 没有全文索引
- 最大表大小为64TB(MyISAM 256TB)
外键s)。您可以使用如下基准:
DO BENCHMARK( 100, (SELECT games.someField
FROM brackets
INNER JOIN relation_table ON relation_table.bracketID = brackets.id
INNER JOIN games ON games.id = relation_table.gameID
LIMIT 1
));
如果迁移到InnoDB没有帮助,恐怕最好的解决方案是迁移代码并将旧结果存储到其他地方(增加数据库的内存限制可能会极大地影响其性能)
无论如何,请将结果发布到评论中,我对这一条很好奇好的,分区有以下优点。
下面是一些摘自mysql文档的摘录。
在答案的末尾,我还提供了一个关于不同数据库的表分区的链接列表。你们中的一些人可能还想阅读有关分片的内容
)
但是,对于每一种技术,分区都应该小心处理,而不仅仅是遵循
盲目地建议它有它的缺点,我发现其中一个可能就是它需要
正如Tom Kyte在其oracle博客中所说,大量交互及其可管理性受到影响:
are your tables getting larger then you feel comfortable managing? eg: it might take longer to
restore a 100gig tablespace than 1-10 gig tablespace (and the other 90gig of data is online whilst
doing this)
优点:
- 分区使得在一个表中存储的数据可能比在单个磁盘或文件系统分区中存储的数据多
- 丢失有用性的数据通常可以通过删除仅包含该数据的分区(或多个分区)轻松地从分区表中删除。相反,在某些情况下,通过添加一个或多个用于专门存储该数据的新分区,可以大大简化添加新数据的过程
- 由于满足给定WHERE子句的数据只能存储在一个或多个分区上,这会自动从搜索中排除任何剩余分区,因此某些查询可以得到极大的优化。由于分区可以在创建分区表后进行更改,因此可以重新组织数据以增强频繁查询,这些查询在首次设置分区方案时可能并不经常使用。这种排除不匹配分区(以及它们包含的任何行)的能力通常被称为分区修剪,并在MySQL 5中实现
通常与分区相关的其他好处包括以下列表中的好处。这些特性目前并没有在MySQL分区中实现,但在我们的优先级列表中是很高的
- 涉及SUM()和COUNT()等聚合函数的查询可以很容易地并行化。此类查询的一个简单示例可能是选择salesperson_id,按salesperson_id;从sales GROUP中将(订单)计数为订单总数;。所谓“并行化”,我们的意思是可以在每个分区上同时运行查询,并且只需将所有分区的结果相加即可得到最终结果
- 通过将数据分散到多个磁盘上实现更大的查询吞吐量
链接
- mysql:
- mssql服务器:
- 甲骨文:
- postgresql:
希望它能帮你一点忙,在你发疯之前
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