MySQL是一种使用广泛的关系型数据库,横纵向分表是优化数据库的一种方式。
横向分表是将一张表水平切分成多个表,每个表只保存一部分数据。这种方式适用于数据量非常大并且数据表结构相对固定的情况。例如,我们可以将用户表按照城市或者地区进行切分,每个表只保存特定地区或城市的用户数据。
CREATE TABLE `user_shanghai` ( `id` INT(11) AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `email` VARCHAR(255) NOT NULL, `phone` VARCHAR(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `user_beijing` ( `id` INT(11) AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `email` VARCHAR(255) NOT NULL, `phone` VARCHAR(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
纵向分表是将一张表垂直切分成多个表,每个表只保存一部分字段,每个表的主键都引用同一张表的主键。这种方式适用于一张表的字段非常多,但有些字段很少使用,并且表的行数不是很大的情况。例如,我们可以将用户表的基本信息字段和联系方式字段划分到两张表中,每张表只保存对应的字段数据。
CREATE TABLE `user_info` ( `id` INT(11) AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `email` VARCHAR(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `user_contact` ( `id` INT(11) AUTO_INCREMENT PRIMARY KEY, `user_id` INT(11) NOT NULL, `phone` VARCHAR(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `user_contact` ADD CONSTRAINT `fk_user_contact_user` FOREIGN KEY (`user_id`) REFERENCES `user_info`(`id`);
横纵向分表可以结合使用,根据实际情况进行选择和使用。