目前是按下边这种规则进行进行分表的
CREATE TABLE `202302_table` (
`id` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`content` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `202303_table` (
`id` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`content` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
.
.
本来想着是使用UNION 进行数据汇总就行查询的,但是表是一只在持续增加的,UNION这种方式就感觉不太适用了,有没有更好的办法进行处理
CREATE TABLE `table` (
`id` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`content` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=NO INSERT_METHOD=LAST UNION=(`202302_table`,`202303_table`);
分表的数据怎么更新,现有想法是每个表 id 生成的时候也是根据日期生成的 20230200001 (Ymd + 随机数),长度固定,根据前缀获取到日期,然后进行拼接找到对应的表,然后再进行操作,这种方法不好,不知有没有其他更法的方式!
这个办法其实可以
如果你不想这样搞,那就先搞一个总表,里面是分表名称和查询条件,然后根据查询条件查到分表名称,再进行操作
我可以给出以下解决方案:
SELECT * FROM my_partition_table WHERE date BETWEEN '2022-01-01' AND '2022-01-31' LIMIT 10, 20;
其中,my_partition_table表示分区表的名称,date为分区字段,'2022-01-01'和'2022-01-31'为日期范围,10和20为分页参数。
(1)创建存储过程:
CREATE PROCEDURE update_data (IN date_prefix VARCHAR(10), IN data_value INT)
BEGIN
SET @table_name = CONCAT('my_', date_prefix, '_table');
SET @sql = CONCAT('INSERT INTO ', @table_name, ' (data) VALUES (', data_value, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
其中,@table_name表示要插入的分表或分区名称,@sql表示要执行的SQL语句,PREPARE和EXECUTE用于动态生成SQL语句并执行,DEALLOCATE用于释放PREPARE的资源。
(2)调用存储过程:
CALL update_data('20220101', 123);
其中,'20220101'为日期前缀,123为数据值。