在实际项目里,子表的个数可以根据实际需求来设置。由于把大表的数据分散到若干张子表里,所以每次数据请求所面对的数据总量能有效降低,从中大家能感受到“分表”做法对提升数据库访问性能的帮助。
并且在实际项目里,会尽量把子表分散创建到不同的主机上,而不是单纯地在同一台主机同一个数据库上创建多个子表,也就是说,需要尽量把这些子表分散到不同的数据库上,具体效果如下图所示。
尽量对子表进行“分库”还是出于提升性能的考虑。由于单台数据库处理请求时总会有性能瓶颈,比如每秒最多能处理500个请求。如果把这些子表放在同一台主机的同一个数据库上,那么对该表的请求速度依然无法突破单台数据库的性能瓶颈。但如果把这些子表分散到不同主机的不同数据库上,那么对该表的请求就相当于被有效分摊到不同的数据库上,这样就能成n倍地提升数据库的有效负载。
在实际项目里,出于成本上的考虑,或许无法为每个子表分配一台主机,在这种情况下可以退而求其次,可以把不同的子表分散创建在同一主机的不同数据库上,总之尽量别在同一主机同一数据库上创建不同的子表。
也就是说,通过“分表”,能有效降低大表的数据规模,通过“分库”,能整合多个数据库,从而能提升处理请求的有效负载。而MyCAT分布式数据库组件,实现这种“分库分表”的效果,所以通常就把它叫做“MyCAT分库分表组件”。
事实上,MyCAT组件能解析SQL语句,并根据预先设置好的分库字段和分库规则,把该SQL发送到对应的子表上执行,再把执行好的结果再返回给应用程序。
2 用MyCAT组件实现分库分表
在上文里已经提到,用MyCAT可以实现分库分表的效果,该组件默认工作在8066端口,它和应用程序以及数据库的关系如下图所示。从中大家可以看到,Java应用程序不是直接和MySQL等数据库互连,而是和MyCAT组件连接。应用程序是把SQL请求发送到MyCAT,而MyCAT根据配置好的分库分表规则,把请求发送到对应的数据库上,得到请求再返回给应用程序。
为了实现分库分表的效果,一般需要配置MyCAT组件里如下表所示的三个文件。