MySQL版本:Mysql5.6.24 Mycat版本:5.5.8-mycat-1.4-RC-20150713190023
分片规则如下:
<table name="p_test" dataNode="dn$1-6" rule="sharding-by-murmur_mobile-phone6" primaryKey="id" autoIncrement="true" needAddLimit="false">
<childTable name="s_test" joinKey="id" primaryKey="id" parentKey="id"/>
</table>
测试结果:
主表p_test 记录数: 10580
子表s_test 记录数: 10580
通过mycat向mysql里灌数据,主表p_test数据在秒级能插入完成。
但子表s_test的插入速度实在是太慢了,基本上是每秒1条。1w多条数据要将近3个小时,传出去岂不是被笑死。
大胆的猜测:
应用都停了,只有mycat在向数据库里灌数据。经测试发现,在向mycat灌数据时,非ER表的插入速度还比较正常。
ER表的主表插入速度也正常,ER表的子表插入速度会比较慢。为什么呢?
可能是因为ER表的子表中没有分片规则,当插入ER表的子表一条数据时,必须遍历所有主表的数据后,才能知道将子表插入到那个节点。
如果我们能给子表增加一个分片规则,这样子表插入的效率能否提高呢?
于是我们参照主表的分片规则,给子表增加了一个分片字段。
这样在业务上并不会破坏原有ER表的关系,且由于有了分片规则,理论上插入的效率相对于没有分片规则的表的效率应该会有提升。
经测试证明:
我们尝试了在ER表子表里增加了与主表片键相同的冗余字段,子表的插入效率提高了至少100倍。
|