MySQL分表后如何查询分页数据及进行更新的

MySQL分表后如何查询分页数据及进行更新的?

使用MySQL 进行分表,分表根据日期进行

如何进行分页查询?

目前是按下边这种规则进行进行分表的

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 + 随机数),长度固定,根据前缀获取到日期,然后进行拼接找到对应的表,然后再进行操作,这种方法不好,不知有没有其他更法的方式!

这个办法其实可以
如果你不想这样搞,那就先搞一个总表,里面是分表名称和查询条件,然后根据查询条件查到分表名称,再进行操作

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/719895
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以给出以下解决方案:

    1. 分页查询 对于根据日期分表的情况,我建议使用MySQL的分区表功能而非分表,这样可以避免每天新增一张表所带来的查询和维护的困难。在分区表中,你可以根据日期进行分区,然后在分区内对数据进行分页查询,如下所示:
    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. 更新数据 对于更新数据的问题,你可以使用MySQL的存储过程来实现,从而根据日期自动将数据插入到对应的分表或分区中。具体实现步骤如下:

    (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为数据值。