一、垂直分库
垂直分库是将一张包含多个字段的大表按照不同的业务拆分到不同的数据库中,每个数据库中只包含相应业务的字段,从而达到降低单个表的数据量的目的。
实现方式一般是通过数据库的视图或者触发器来实现,这里我们以MySQL为例进行详细讲解。下面是创建视图语法:
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition;
下面是创建触发器语法:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN -- 触发器内容 END;
下面是一个使用视图实现垂直分库的示例代码:
-- 创建视图,只包含user_id和user_name字段 CREATE VIEW user_info_view AS SELECT user_id, user_name FROM user_info; -- 创建用户订单表 CREATE TABLE user_order ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL, ... PRIMARY KEY (id)); -- 在订单表中使用user_info_view视图 CREATE TRIGGER user_order_insert BEFORE INSERT ON user_order FOR EACH ROW SET NEW.user_name = (SELECT user_name FROM user_info_view WHERE user_id = NEW.user_id);
二、水平分库
水平分库是将一张大表按照某个字段进行拆分,将拆分后的数据分散到不同的数据库中,例如根据用户ID将用户信息分布到多个数据库中,从而避免单个数据库压力过大。
实现方式一般是通过中间件或者应用程序来实现数据路由和数据分片,这里我们以TiDB为例进行详细讲解。下面是创建分片表的语法:
CREATE TABLE table_name ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, PRIMARY KEY (id) ) PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (200), PARTITION p2 VALUES LESS THAN (300), PARTITION p3 VALUES LESS THAN MAXVALUE );
上述创建语句中,使用了PARTITION BY RANGE (id)关键字来指定按照id字段进行分片,根据id字段的值将数据存储到不同的分区中。这里我们将数据按照id字段的值分成了4个分区。
三、水平分表
水平分表是将一张大表按照某种规则拆分成多个小表,例如根据时间将一张订单表拆分成多个小表,每个小表只包含某个时间段内的订单数据。
实现方式一般是通过应用程序来实现,即根据业务需要动态创建和删除表,将不同时间段的数据存储到不同的表中。下面是一个动态创建表的示例代码:
-- 将时间格式化为年月日 $date = date('Ymd', strtotime($time)); -- 构造表名 $tableName = 'order_' . $date; -- 查询数据库是否存在当前表 $sql = "SHOW TABLES LIKE '$tableName'"; $table = $db -> query($sql) -> fetchAll(); -- 如果表不存在则创建表 if (empty($table)) { // 创建订单表 $sql = "CREATE TABLE $tableName ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, order_no VARCHAR(32) NOT NULL, ...)"; $db -> query($sql); } -- 插入数据到订单表中 $sql = "INSERT INTO $tableName (order_no, ...) VALUES (?, ...)"; $db -> query($sql, [$orderNo, ...]);
四、分布式数据库
分布式数据库是将数据分散到多个节点上,通过数据之间的分布式协作来实现数据处理。
实现方式一般是通过分布式数据库中间件来实现,例如MySQL集群、TiDB等。
下面是TiDB的一个示例代码:
-- 连接TiDB集群 $dsn = 'mysql:host=127.0.0.1;port=4000;dbname=test'; $db = new \PDO($dsn, 'root', ''); -- 查询数据 $sql = "SELECT * FROM user_info WHERE user_id = ?"; $userId = 1; $rows = $db -> query($sql, [$userId]) -> fetchAll(PDO::FETCH_ASSOC);
五、数据同步
在使用分库分表的过程中,由于数据被分散到多个数据库中,必然会出现数据不一致的问题,需要使用数据同步技术来解决数据不一致的问题。
实现方式一般是通过将主库的数据同步到备库中,用于备库的读取。
下面是使用MySQL主从复制实现数据同步的示例代码:
-- 配置主库 [mysqld] log-bin=mysql-bin server-id=1 -- 配置从库 [mysqld] server-id=2 relay-log=mysql-relay-bin log_slave_updates=1 -- 在主库上创建用户信息表 CREATE TABLE user_info ( user_id INT(11) NOT NULL PRIMARY KEY, user_name VARCHAR(255) NOT NULL, ...); -- 在从库上读取用户信息 SELECT * FROM user_info;
六、总结
以上是分库分表的几种实现形式,每种实现形式都有其独特的优缺点,需要根据实际业务情况进行选择。同时,在使用分库分表技术的时候,需要考虑到数据一致性、数据分散性、负载均衡等问题,从而保证分库分表的顺利运行。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/162664.html