使用Mycat操作Oracle数据库(六) -- 分片原则

来源:互联网 发布:淘宝卖家如何发货 编辑:程序博客网 时间:2024/05/22 10:22

分表分库虽然能解决大表对数据库系统的压力,但它并不是万能的,也有一些不利之处,因此首要问题是,分不分库,分哪些
库,什么规则分,分多少分片。
原则一:能不分就不分,1000万以内的表,不建议分片,通过合适的索引,读写分离等方式,可以很好的解决性能问题。
原则二:分片数量尽量少,分片尽量均匀分布在多个DataHost上,因为一个查询SQL跨分片越多,则总体性能越差,虽然要好于
所有数据在一个分片的结果,只在必要的时候进行扩容,增加分片数量。
原则三:分片规则需要慎重选择,分片规则的选择,需要考虑数据的增长模式,数据的访问模式,分片关联性问题,以及分片扩
容问题,最近的分片策略为范围分片,枚举分片,一致性Hash分片,这几种分片都有利于扩容
原则四:尽量不要在一个事务中的SQL跨越多个分片,分布式事务一直是个不好处理的问题
原则五:查询条件尽量优化,尽量避免Select * 的方式,大量数据结果集下,会消耗大量带宽和CPU资源,查询尽量避免返回大
量结果集,并且尽量为频繁使用的查询语句建立索引。
这里特别强调一下分片规则的选择问题,如果某个表的数据有明显的时间特征,比如订单、交易记录等,则他们通常比较合适用
时间范围分片,因为具有时效性的数据,我们往往关注其近期的数据,查询条件中往往带有时间字段进行过滤,比较好的方案
是,当前活跃的数据,采用跨度比较短的时间段进行分片,而历史性的数据,则采用比较长的跨度存储。
总体上来说,分片的选择是取决于最频繁的查询SQL的条件,因为不带任何Where语句的查询SQL,会便利所有的分片,性能相
对最差,因此这种SQL越多,对系统的影响越大,所以我们要尽量避免这种SQL的产生。
如何准确统计和分析当前系统中最频繁的SQL呢?有几个简单做法:
- 采用特殊的JDBC驱动程序,拦截所有业务SQL,并写程序进行分析
- 采用Mycat的SQL拦截器机制,写一个插件,拦截所欲SQL,并进行统计分析
- 打开MySQL日志,分析统计所有SQL
找出每个表最频繁的SQL,分析其查询条件,以及相互的关系,并结合ER图,就能比较准确的选择每个表的分片策略。
数据拆分原则
1.达到一定数量级才拆分(800万)
2.不到800万但跟大表(超800万的表)有关联查询的表也要拆分,在此称为大表关联表
大表关联表如何拆:小于100万的使用全局表;大于100万小于800万跟大表使用同样的拆分策略;无法跟大表使用相同规则的,可以考虑从java代码上分步骤查询,不用关联查询,或者破例使用全局表。
3.破例的全局表:如item_sku表250万,跟大表关联了,又无法跟大表使用相同拆分策略,也做成了全局表。破例的全局表必须满足的条件:没有太激烈的并发update,如多线程同时update同一条id=1的记录。虽有多线update,但不是操作同一
行记录的不在此列。多线程update全局表的同一行记录会死锁。批量insert没问题。
4.拆分字段是不可修改的
5.拆分字段只能是一个字段,如果想按照两个字段拆分,必须新建一个冗余字段,冗余字段的值使用两个字段的值拼接而成
(如大区+年月拼成zone_yyyymm字段)。
6.拆分算法的选择和合理性评判:按照选定的算法拆分后每个库中单表不得超过800万 7.
能不拆的就尽量不拆。如果某个表不跟其他表关联查询,数据量又少,直接不拆分,使用单库即可。

摘自 mycat 权威指南

原创粉丝点击