横向分库
横向分库是将数据行按照某种规则分布到多个数据库中。比如,可以按照用户ID的哈希值,将用户数据均匀地散布在多个数据库中。这种方式的优势在于可以平衡每个数据库的负载,提高数据库的读写性能和可靠性。
CREATE TABLE users (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
password CHAR(32) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
KEY (username),
KEY (email)
) ENGINE=InnoDB;
CREATE TABLE users_1 (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
password CHAR(32) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
KEY (username),
KEY (email)
) ENGINE=InnoDB;
CREATE TABLE users_2 (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
password CHAR(32) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
KEY (username),
KEY (email)
) ENGINE=InnoDB;
…
在这种情况下,用户表根据哈希值被均匀地分布在多个数据库中,每个数据库只存储部分数据行。
纵向分库
纵向分库是将数据表按照某种规则分成多个表,通常是将一张表中的数据按照列的不同部分存储在不同的表中。比如,可以将users表的敏感数据,例如用户密码和电子邮件地址,存储在一个表中,而将不敏感的数据,例如用户名,存储在另一个表中。
CREATE TABLE users (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
KEY (username)
) ENGINE=InnoDB;
CREATE TABLE users_sensitive_data (
user_id INT(11) UNSIGNED NOT NULL,
password CHAR(32) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (user_id),
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;
…
在这个例子中,users表和users_sensitive_data表共同存储用户数据,但是敏感数据被存储在另外一个表中,与不敏感数据分离开来。
总之,横向和纵向分库都不是复杂的操作,但是使用这些技术,需要良好的数据模型设计和合理的规则选择。这些技术可以帮助维护大型数据量的数据库,并使其更加可靠,高效和扩展性。