數據庫分庫分表和讀寫分離區別,分庫分表是在多個庫建相同的表和同一個庫建不一樣的表,根據隨機或者哈希等方式查找實現。讀寫分離是爲了解決數據庫的讀寫性能不足,使用主庫master進行寫操做,從庫slave進行讀操做,經過binglog實現主被庫數據的同步。
實現數據庫分庫分表能夠本身實現,也能夠使用mycat和sharding-jdbc實現。java
(1)olap和oltp聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processing)。OLTP是傳統的關係型數據庫的主要應用,主要是基本的、平常的事務處理,例如銀行交易。OLAP是數據倉庫系統的主要應用,支持複雜的分析操做,側重決策支持,而且提供直觀易懂的查詢結果。
(2)分佈式數據庫的自增ID不是自增的。分佈式數據庫分頁查詢須要使用插入時間實現。
(3)explain命令,explain顯示了mysql如何使用索引來處理select語句以及鏈接表。能夠幫助選擇更好的索引和寫出更優化的查詢語句。在select語句前面加上就能夠。node
sharding-jdbc是噹噹網開源的一款客戶端代理中間價。sharding-jdbc包含分庫分片和讀寫分離功能。對應用的代碼沒有侵入型,幾乎沒有任何改動,兼容主流orm框架,主流數據庫鏈接池。目前屬於apache的孵化項目shardingSphere,發展迅猛。sharding-jdbc實現實現讀寫分離不能實現主從庫數據同步mysql
(1)建立sharding-jdbc項目和數據庫 ds_master_0,ds_master_1,ds_master_0_slave_0,ds_master_1_slave_0spring
create table order0 ( id bigint(11) not null comment '主鍵ID' primary key, user_id bigint(11) null comment '用戶ID', order_id bigint(11) null comment '訂單ID' ); create table order1 ( id bigint(11) not null comment '主鍵ID' primary key, user_id bigint(11) null comment '用戶ID', order_id bigint(11) null comment '訂單ID' );
(2)添加依賴sql
<dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.13</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency>
(3)配置文件數據庫
spring.application.name=sharding-jdbc #mybatis mybatis.configuration.map-underscore-to-camel-case=true mybatis.mapper-locations=classpath:mapper/*Mapper.xml #當註冊遇到相同名字是否容許被註冊,在配置中心無效 spring.main.allow-bean-definition-overriding=true #全部主從庫 sharding.jdbc.datasource.names=dsmaster0,dsmaster1,dsmaster0slave0,dsmaster1slave0 #dsmaster0 sharding.jdbc.datasource.dsmaster0.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.dsmaster0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.dsmaster0.url=jdbc:mysql://ailijie.top:3306/ds_master_0?useSSL=false sharding.jdbc.datasource.dsmaster0.username=root sharding.jdbc.datasource.dsmaster0.password= #slave for ds_master_0 sharding.jdbc.datasource.dsmaster0slave0.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.dsmaster0slave0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.dsmaster0slave0.url=jdbc:mysql://ailijie.top:3306/ds_master_0_slave_0?useSSL=false sharding.jdbc.datasource.dsmaster0slave0.username=root sharding.jdbc.datasource.dsmaster0slave0.password= #dsmaster1 sharding.jdbc.datasource.dsmaster1.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.dsmaster1.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.dsmaster1.url=jdbc:mysql://ailijie.top:3306/ds_master_1?useSSL=false sharding.jdbc.datasource.dsmaster1.username=root sharding.jdbc.datasource.dsmaster1.password= #slave for ds_master_1 sharding.jdbc.datasource.dsmaster1slave0.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.dsmaster1slave0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.dsmaster1slave0.url=jdbc:mysql://ailijie.top:3306/ds_master_1_slave_0?useSSL=false sharding.jdbc.datasource.dsmaster1slave0.username=root sharding.jdbc.datasource.dsmaster1slave0.password= #分庫規則 sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=user_id sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=dsmaster${user_id % 2} #分表規則 sharding.jdbc.config.sharding.tables.order.actual-data-nodes=dsmaster${0..1}.order${0..1} sharding.jdbc.config.sharding.tables.order.table-strategy.inline.shardingColumn=order_id sharding.jdbc.config.sharding.tables.order.table-strategy.inline.algorithmExpression=order${order_id % 2} #使用id做爲分佈式主鍵 sharding.jdbc.config.sharding.tables.order.key-generator-column-name=user_id #邏輯主從庫名和實際主從庫映射關係 #sharding.jdbc.config.sharding.master-slave-rules.ds0.master-data-source-name=dsmaster0 #用逗號分隔 #sharding.jdbc.config.sharding.master-slave-rules.ds0.slave-data-source-names=dsmaster0 #sharding.jdbc.config.sharding.master-slave-rules.dsmaster1.masterDataSourceName=dsmaster1 #sharding.jdbc.config.sharding.master-slave-rules.dsmaster1.slaveDataSourceNames=dsmaster1slave0
(5)實體類 Orderexpress
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class Order implements Serializable { private static final long serialVersionUID = 427226138907372838L; private Long id; private Integer userId; private Integer orderId; }
(4)controller外部接口apache
@Slf4j @RequestMapping("sharding") @RestController public class ShardingController { @Autowired private OrderMapper orderMapper; @RequestMapping public String helloShardin(){ return "hello Sharding-jdbc"; } @RequestMapping("insert") public void insert(@RequestParam Integer orderId, @RequestParam Integer userId) { Order order = Order.builder() .orderId(orderId).userId(userId).build(); orderMapper.insert(order); Long id = order.getId(); log.info("Generated Key--id:" + id); } @RequestMapping("queryAll") public void findAll() { List<Order> orders = orderMapper.queryAll(); log.info("user:{}", orders); log.info("user:{}",orders.size()); } @RequestMapping("getById") public void getById(@RequestParam Long id) { Order order = orderMapper.queryById(id); log.info("user:{}", order); } @RequestMapping("getByUserId") public void getByUserId(@RequestParam Long userId) { List<Order> orders = orderMapper.queryByUserId(userId); log.info("user:{}", orders); } @RequestMapping("deleteById") public void deleteById(@RequestParam Long id) { orderMapper.deleteById(id); log.info("user:{}", id); } }
使用sharding-jdbc沒有侵入性,不會影響業務代碼。
能夠使用Springboot的配置文件規範進行配置。mybatis
有問題,請留言!app
我的博客地址 歡迎訪問