一、分表的好处:
1.提升查询速度:分表筛选后再拼接,而不是查大表,速度会显著提升
2.管理容易:根据业务需求,通常会按照时间或者空间来分表
3.提高并发性:降低锁竞争和查询阻塞的风险,提高数据库的并发处理能力。
4.优化备份:优先备份重要分表
5.提高稳定性:减少单表故障对整个系统的影响,提高了系统的可靠性和稳定性
二、分表如何实现
【思考】分表后如何查询?例如我分了一个student_1990到student_2025表,我想查这些学生表(student_xxxx)中叫张三的人。
不应该的写法(写法多、每年需要修改一次):
SELECT * FROM student_1990 WHERE name = '张三'
UNION ALL
SELECT * FROM student_1991 WHERE name = '张三'
UNION ALL
SELECT * FROM student_1992 WHERE name = '张三'
-- 继续依次查询所有的 student_xxxx 表,直到 student_2025
UNION ALL
SELECT * FROM student_2025 WHERE name = '张三';
推荐思路:
1.先查出有多少张这种表
SELECT name FROM sys.objects WHERE type = 'U' AND name LIKE 'student_%'
2.UNION ALL语法遍历拼接SQL
3.执行SQL
具体写法(SQL):
DECLARE @sql NVARCHAR(MAX);
DECLARE @tableName NVARCHAR(100);
DECLARE @nameToSearch NVARCHAR(100);
SET @nameToSearch = '张三'; -- 要查询的学生姓名
SET @sql = '';
-- 构建动态SQL,查询所有符合 'student_' 开头的表
SELECT @sql = @sql +
CASE WHEN @sql = '' THEN '' ELSE ' UNION ALL ' END +
'SELECT * FROM ' + QUOTENAME(name) + ' WHERE name = @nameToSearch'
FROM sys.objects
WHERE type = 'U' AND name LIKE 'student_%';
-- 执行动态SQL
EXEC sp_executesql @sql, N'@nameToSearch NVARCHAR(100)', @nameToSearch;
当然,在程序中写也是可以的,用foreach遍历拼接字符串输入。
三、预先分表还是动态分表?
【名词解释】预先分表是程序员先分号表再安排数据插入,例如我创建student_1990到student_2099的表,这个就叫预先分表,而动态分表是每次插入前判断有没有该数据表,没有则创建,有则插入。
【解答】需要根据实际需求判断:
- 数据量和增长率:如果数据量固定或增长缓慢,预先分表可能更合适;若数据量大或增长快,动态分表更为灵活。
- 维护和管理复杂度:预先分表简化了查询和维护,但可能导致过多的空表存在;动态分表更具灵活性,但需要额外的逻辑来管理表的创建和维护。