分表就是把一张表拆分成多个表,每个表只存放一部分数据。这样可以避免单表数据过大导致的查询性能下降、写入性能下降等问题。
下面是一种比较常用的分表方案:
CREATE TABLE user_0 ( id INT(10) unsigned NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL, gender TINYINT(1) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE user_1 ( id INT(10) unsigned NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL, gender TINYINT(1) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; ... CREATE TABLE user_N ( id INT(10) unsigned NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL, gender TINYINT(1) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
这个方案的思路是根据主键的hash值将数据均匀地分配到不同的表中。假设大家要把用户表进行分表,主键为id,将数据按id的值取模,将余数为0的记录放到user_0表中,余数为1的放到user_1表中,以此类推,最终大家可以得到user_0,user_1,…,user_N共N+1张表。
在查询数据时,如果大家需要查询id=100的这条记录,可以根据id的值取模得到它在哪张表中,然后直接在那张表中查询即可。这样就避免了在单张表中查询数据时的性能问题。
总之,使用分表可以提高MySQL的性能和稳定性,但需要根据数据量和查询需求进行合理的设计和划分。