Mysql分表技术

Mysql分表技术

场景

根据不同的日期yyyyMMdd,将数据存入到不同的表中,以达到提高单表查询的性能。

工具类

public class TableUtils {
	private static final Date _19700101 = DateUtil.parseDate("19700101", "yyyyMMdd");

    /**
     * 分表路由算法 可用于AB表以及套表 按照指定日期和19700101之间的时间差计算表号
     *
     * @param yyyMMdd_DateTime
     *            yyyyMMdd格式
     * @param maxLogNo
     *            分表个数
     * @param cutInterval
     *            切表周期
     * @return 分表的下标
     */
    public static int getHisLogNoExt(String yyyMMdd_DateTime, int maxLogNo, int cutInterval) {
        if (maxLogNo < 1 || maxLogNo > 366) {
            throw new IllegalArgumentException("unexcepted maxLogNo,excepted one is [1,366]");
        }
        if (cutInterval < 1 || cutInterval > 366) {
            throw new IllegalArgumentException("unexcepted cutInterval,excepted one is [1,366]");
        }
        if (!DateUtil.isValidDate(yyyMMdd_DateTime, "yyyyMMdd")) {
            throw new IllegalArgumentException("unexcepted dateformat");
        }
        Date date = DateUtil.parseDate(yyyMMdd_DateTime, "yyyyMMdd");
        /** 计算指定时间与1970-01-01 00:00:00之间的天数差 */
        long gapDays = DateUtil.compute(date, _19700101, DateUtil.DateEnum.DAY);
        /** 分片的倍数 */
        int times = (int) ((gapDays - (gapDays % cutInterval)) / cutInterval);
        return times % maxLogNo + 1;
    }
}

具体使用

基础表名: tbl_xxx_log 拼接 索引号
入参介绍:数据的date yyyyMMdd(年月日)
代码解释:根据当前数据的算表时间,从1-19张表中,获取表号,其中10代表10天切换一次表

tableName = "tbl_xxx_log" + TableUtils.getHisLogNoExt(date, 19, 10)

学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:543120397 我们一起学Java!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章