淘宝TDDL数据库分库分表

来源:互联网 发布:淘宝网直通车怎么用 编辑:程序博客网 时间:2024/05/03 04:57

1. 分库分表,而且分库规则非常灵活.

2. 主键生成策略 

目前TDDL提供的id生成主要还是依托数据库来进行的,oracle可以直接使用sequence来完成id生成,mysql则需要DBA建立一个表专门用于生成id.

3. 连接查询策略

虽然TDDL目前并不直接支持连接查询,但连接查询在业务中也是常见的查询。处理这类查询时,需要由业务去决定如何实现这类查询。

处理这类查询时,一个普遍的原则是尽量保证查询发生在一个数据库中,如果不能发生在同一个数据库中,尽量避免全表全库查询。

4.不支持的SQL操作

        Join:

        包含nature left right inner outer join等都不进行支持。

多表查询:

在整个sql中不能出现多于一个表名的情况。但需要注意的是,TDDL支持嵌套的查询,但TDDL也要求嵌套SQL内的表名也必须是与嵌套外的表名一致。这样整个语义由数据库保证。

         Between……and:

                   目前还不支持Between and关系,可以暂时使用><的方式代替
         Not:
                   所有的Not语义中,目前除了not like以外都不予以支持。
         Comment:
                   TDDL目前还不支持任何种类的注释。
         For update:
                   TDDL目前还不支持强制指定使用排他锁的方式。
         Group function:
如Count,avg,max,min等,目前暂时还不支持,需要业务在前端进行合并,在以后的版本中会对出现在column列名字段的聚合函数予以支持。但不会对group by 中having后出现的聚合函数加以支持。
目前count()函数可以在column列中被识别,但最后会返回多个int值。以后会将其聚合在一起。
         Force index:
                   在目前的版本内还不能予以支持。
         Group by:
                   聚合函数目前不予以支持,因为脱离数据库以后做聚合非常困难。
         Having:
                   Having以及having内使用的其他聚合函数。
         大部分函数:

                   目前很多mysql独有的函数都不能予以支持。

5.支持的SQL操作

        CRUD:

                   增删改查基本语法支持。
         AS:

                   别名支持

         表名限定:

                   允许在列名前使用“表名.”的方式来添加表名限定词。

         Like:
                   Not like ,like 从语义和语法上都是支持的
         Limit:
                   Mysql特殊的分页语法。
         用括弧提升优先级:
                   支持在sql的where条件中使用括弧。
         In:
                   In 操作支持
         Is:
                   Is操作支持
         嵌套查询:
嵌套查询包含两类,第一类是在表名部分的嵌套查询,第二类是在where条件中的嵌套查询,只要嵌套查询内的所有表名全部一致,就可以使用。
         基本数据操作:
+ - * / 都是可以识别的,也可以正确的被转化回sql,但这类基本数据操作是不能被使用在分库和分表字段的。分库分表字段必须都是简单的数据字段。
         部分函数支持:
                   Sysdate()函数,now()函数,ifnull()函数。

6.事务的有限支持

支持基于单库的事务,但不支持跨库进行事务。跨库事务本身会耗费很多宝贵的资源,在大型分布式系统中应该尽量避免使用分布式事务处理机制,可以通过补偿等方式保证分布式环境中的数据的最终一致性,如果在一个事务过程中出现了多个不同的数据源,则系统会抛出异常。同时,如果在一个事务中使用了非TDDL TDataSource管理的数据源,Spring和TDDL都不能够保证事务的ACID。如果是针对单个数据库的事务,使用的方式与以前的使用方式完全一致。如果需要使用spring的数据库事务管理,则只需要使用TransactionAwareDataSource对TDataSource进行包装后使用TranscationManager进行管理即可。

7.支持多库多表的分页查询

在查询前几页的数据时,多库多表查询本身的性能是可以接受的,也不需要担心占用较多内存的问题。他的效率与从第一条数据开始全取数据到max指定的行的效率是基本一致的。因此,他比较适合于查询按照时间排序的数据,并且最好是查到就处理,不会翻页到很后面,在这类场景中,使用多库多表的分页查询效果较好。

8.每次查询所用的连接是与Datasource关联

    假设有1024张表,分在16个数据库中,那么在全查1024张表的时候,总共应有16个连接.

9.默认就可以支持读写分离的

      对于Mysql:数据复制采用mysqlLog的方式进行。
对于Oracle:数据的复制采取TDDL的一个可选插件来进行,该插件是基于notify的一个对于oracle进行行复制插件。

10.针对有ID的数据,有几类处理的方法:

  1>.在ID字段中包含分库信息,这样我们就可以通过这个ID里面的某些位就可以直接获取分库信息了。(新系统可以采取这类方式,TDDL提供了生成这种ID的便捷方法。)

  2>.通过TDDL的ID=>分库映射cache来完成映射关系(这只针对老系统,目前的优先级还不高,将在以后的版本提供)。也可以查看成功实践中的总结信息
0 2