MYISAM分片与使用InnoDB相比

Vis*_*ish 0 mysql database myisam innodb

我有一个表具有非常高的插入率和更新率以及读取率.平均每秒插入和更新大约100行.每秒大约有1000个选择.

该表有大约1亿个元组.这是一个关系表,所以它只有大约5个字段.三个字段包含键,因此它们被索引.所有字段都是整数.

我正在考虑对数据进行分片,但是,它增加了很多复杂性,但确实提供了速度.另一种选择是使用innodb.

该数据库运行在256GB ssd的raid 1上,32GB 1600mhz的RAM和i7 3770k,时钟频率为4Ghz

数据库在高峰时间不断冻结,其中查询可以高达插入或更新200行,每秒2500次选择

你们可以指出我应该做什么吗?

taz*_*r84 5

分片通常是分配表大小的好主意.通常应使用复制的数据环境来解决负载问题.在你的情况下你的问题是a)巨大的表和b)表级锁定和c)糟糕的硬件.

InnoDB的

如果你可以使用表上的一个键作为主键,InnoDB可能是一个很好的方法,因为他会让你进行行级锁定,这可能会减少你的查询等待彼此.一个好的测试可能是将您的表复制到测试服务器并尝试针对他的所有查询,并查看性能优势.InnoDB具有比MyISAM更高的资源消耗率,因此请记住这一点.

硬件

我很抱歉,但你的硬件是你需要的性能废话.Twitter以每秒2.6k QPS的速度执行34次写入.你无法做Twitter的数量,并认为增强的游戏桌面将削减它.用一些SSD驱动器购买价值1.5万美元的戴尔,你将能够突破100k QPS.你现在正处于重要时期.现在是时候放弃启动设备,让自己成为一个不错的服务器.你希望碎片.升级你的硬件会更便宜,坦白说,你需要.

拆分

分割是很棒的分割大表.就是这样.

让我明白坏事.开发分片架构很糟糕.你想尽一切可能不去碎.升级硬件,购买多台服务器并设置复制,优化您的代码,但为了爱上帝,不要破坏.您远远低于分片的性能线.当你的推动持续30k + QPS,那么我们可以讨论分片.直到那一天,没有.

您可以在16核和256 GB RAM上购买具有5TB Fusion IO的中程服务器(3万美元Dell PowerEdge),他将带您一路达到200k QPS.

但是如果你拒绝听我说并且无论如何都要打碎,那么这就是你需要做的.

规则1:保持相同的碎片(即,选择分区规则)

分片后,您希望从多个分片中访问数据.您需要选择一个分区规则,使您的查询尽可能保持在同一个分片上.在分布式数据环境中分发查询(规则4)非常痛苦.

规则2:构建分片映射并复制它

您的代码需要能够访问所有分片.根据您的分区规则创建一个分片映射,让您的代码知道去哪里获取他想要的数据.

规则3:为Shards编写一个Query Wrapper

您不想手动决定要转到哪个分片.写一个包装,为你做.当你编写代码时,你会感谢自己.

规则4:自动平衡

您最终需要平衡分片以保持最佳性能.事先做好计划并写下你的代码,意图是你有一些kron工作可以平衡你的分片.

规则4:支持分布式查询

您不可避免地需要违反规则1.当发生这种情况时,您将需要一个查询包装器,它可以从多个分片中提取数据并将其聚合(带)到一个位置.您拥有的分片越多,就越有可能需要多线程.在我的商店中,我们称之为分布式查询(即在多个分片上运行的查询).

坏消息:没有用于执行分布式查询和聚合结果的代码.Apache Hadoop尝试,但他很糟糕.HiveDB也是如此.一个好的查询分销商很难设计,难以编写,难以优化.这是公司每年处理的十亿美元问题.我没骗你,但是如果你想出一个好的包装器来分发支持排序+限制条款和扩展的分片的查询,你可能会成为一个百万富翁过夜.以300,000美元的价格出售?你的门外有一英里长的线.

我的观点是分片很难而且价格昂贵.它需要做很多工作,你想做一切人性化的事情而不是碎片.如果必须,请遵守规则.