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!

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