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!