为了提高服务器上的插入性能和负载,我决定将一个大表分成2个。一个大表只用于“select”和一个较小的表,主要用于“insert” “有时候也会”选择“。每个时期(我想过一天)我会把较小的表合并成一个大表。
重新升级大表:有没有办法通过告诉mysql服务器只读它来提高性能?考虑到它仅用于选择,我可以假设它将在不到1秒的时间内处理SELECT。什么时候会变成~1e9行?
关于小桌子:我应该在这做什么调整?从小表到大表(在php中)开发自动合并过程的最佳方法是什么?
答案 0 :(得分:4)
我已经看到过这个和类似的策略用于此目的,它一直适得其反。您最终会创建复杂性,并获得更多的开销。例如,您保证每条记录至少插入两次。
一定要仔细测量并进行比较以确认您的假设,然后才能做到这一点。
我发现绕过MyISAM表上的删除非常有效。例如,您可以每天一次切换到一个新的小表,并且一旦两者都是只读的,就将旧的表合并为一个大表。然后丢掉旧的。一旦删除开始显示在MyISAM表中,其效率就会显着下降,因为必须找到并重用空洞。
Konerak关于打包ISAM表的建议是对这一观点的一个很好的补充。一个结果是它为您提供了一个没有洞的表(和索引)。
答案 1 :(得分:3)
我相信你不需要这个..
如果您的目标是为SELECT
查询提供更多优先级,则可以使用INSERT DELAYED
进行插入。
答案 2 :(得分:3)
Packed ISAM tables非常适合作为MySQL只读表,但是对于繁重的查询,你仍然需要正确的索引。
但请确保这是您问题的解决方案(并考虑了其他选项,包括索引和分区)
答案 3 :(得分:1)
我认为您不需要为SELECT和INSERT维护不同的表,主要是因为INSERT的数量不是很大或频繁。如果表具有正确的索引,则SELECT将是有效的。但请注意,太多索引可能会导致INSERT失败。
通过维护不同的表,我认为它对服务器负载没有任何好处,因为每条记录都会运行2个INSERT。
如果您认为SELECT具有更高的优先级,您可能还想查看INSERT DELAYED,但我建议您在使用它们之前阅读它们。
我还建议您使用InnoDB,因为它使用行级锁定。
您也可以尝试分区;我认为在你的情况下它可能是水平分区。虽然我承认我自己没有使用它的经验。
但是,如果你认为拆分表是最好的,我建议你去探索其他选择。与将INSERT表中的数据迁移到SELECT表不同,您可以对INSERT和SELECT使用相同的表,但是要维护多个表,例如每月一个表或适合您的任何其他条件。然后,您可以构建逻辑来决定运行查询的表。您最终可能还会合并旧表以创建一个大表,并删除旧表。