一丶分库分表注意事项: 1、维度问题 假如用户购买了商品,需 要将交易记录保存取来,如果按照用户的纬度分表,则每个用户的交易记录都保存在同一表中,所以很快很方便的查找到某用户的购买情况,但是某商品被购买的情 况则很有可能分布在多张表中,查找起来比较麻烦。反之,按照商品维度分表,可以很方便的查找到此商品的购买情况,但要查找到买人的交易记录比较麻烦。 所以常见的解决方式有: 通过扫表的方式解决,此方法基本不可能,效率太低了。 记录两份数据,一份按照用户纬度分表,一份按照商品维度分表。 通过搜索引擎解决,但如果实时性要求很高,又得关系到实时搜索 2、避免分表join操作 因为关联的表有可能不在同一数据库中 3、避免跨库事务 避免在一个事务中修改db0中的表的时候同时修改db1中的表,一个是操作起来更复杂,效率也会有一定影响 4、分表宜多不宜少;这样做主要是为了尽量避免后期可能遇到的二次拆分 5、尽量把同一组数据放到同一DB服务器上。 二丶MySQL使用为什么要分库分表 可以用说用到MySQL的地方,只要数据量一大, 马上就会遇到一个问题,要分库分表. 这里引用一个问题为什么要分库分表呢?MySQL处理不了大的表吗? 其实是可以处理的大表的.我所经历的项目中单表物理上文件大小在80G多,单表记录数在5亿以上,而且这个表 属于一个非常核用的表:朋友关系表. 但这种方式可以说不是一个最佳方式. 因为面临文件系统如Ext3文件系统对大于大文件处理上也有许多问题. 这个层面可以用xfs文件系统进行替换.但MySQL单表太大后有一个问题是不好解决: 表结构调整相关的操作基 本不在可能.所以大项在使用中都会面监着分库分表的应用. 从Innodb本身来讲数据文件的Btree上只有两个锁, 叶子节点锁和子节点锁,可以想而知道,当发生页拆分或是添加 新叶时都会造成表里不能写入数据. 所以分库分表还就是一个比较好的选择了. 那么分库分表多少合适呢? 经测试在单表1000万条记录一下,写入读取性能是比较好的. 这样在留点buffer,那么单表全是数据字型的保持在 800万条记录以下, 有字符型的单表保持在500万以下. 如果按 100库100表来规划,如用户业务: 500万*100*100 = 50000000万 = 5000亿记录. 心里有一个数了,按业务做规划还是比较容易的. 三、什么是分库分表 分库: 1)按功能分 用户类库、商品类库、订单类库、日志类、统计类库... 1)按地区分 每个城市或省市一个同样的库,加上后缀或前缀如:db_click_bj、db_click_sh... 分表: 1、横向分表 解决表记录太大问题 1)按某个字段分, 如:discuz的附件表分成10个附件分表pre_forum_attachment_0到pre_forum_attachment_9,还有1个附件索引表pre_forum_attachment存储tid和附件id关系 根据主题的tid最后一位来决定附件要保存在哪个分表, 2)按日期分表 一些日志、统计类的可以按年、月、日、周分表 如:点击量统计click_201601、click_201602 3)使用mysql的merge 先把分表创建好,然后创建总表指定engine= MERGE UNION=(table1,table2) INSERT_METHOD = LAST; 2、纵向分表 解决列过多问题 1)经常组合查询的列放在一个表,常用字段的表可考虑Memory引擎 2)不经常使用的字段单独成表 3)把text、blob等大字段拆分放在附表 如:phpcms的文章表分成主表v9_news和从表v9_news_data,主表存标题、关键字、浏览量等,从表存具体内容、模板等 很多主流mvc框架都提供了切换数据库访问方法 thinkphp切换数据库 $this->db(1,"mysql://root:123456@localhost:3306/test")->query("查询sql");//数据库连接信息可放在配置文件 $this->db(1)->query("查询sql");//下次直接使用编号1定位 分表的话 在查询前先根据分表规则把表名查出 这里用两台机子简单以同个业务库分库,同个表分表,演示插入、查询如何定位库和表并最终成功执行 两台机子: server1:192.168.1.198 server2:192.168.1.199 两台机子都执行下面操作 四丶小结 对 于分布式数据库架构来说,排序、分页、分组一直就是一个比较复杂的问题。避免此问题需要好好地设计分库、分表策略。同时根据特定的场景来解决问题。也可以 充分利用海量数据存储。 以上是对mysql分库分表总结,分享给大家,希望大家可以了解什么是mysql分库分表。觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持。(吹一波,233~~) |