settimestamp
clickhouse的jdbc驱动对于datetime64这种类型的时间存在精度丢失。一开始测试人员发现数据是毫秒数都是0直接提bug,然后让公司同事先搜下mybatis的时间精度问题,大体都是说指定jdbcType为TIMESTAMP,试了返回的date类型数据毫秒数还是丢失。无奈之下只能断点调试跟踪源码了,发现mybatis的DateTypeHandler处理时间戳转换有问题,进一步跟踪发现jbbc的resultset返回的时间数据是有毫秒的,于是进一步定位到clickhouse resultset里发现对应数据库返回的时间类型简单粗暴的用Yyyy-mm-dd hh:mm:ss进行格式化,导致毫秒数丢失,至此精度丢失的本质问题已经找到。于是覆盖这个类,将时间处理函数重写,问题得以解决。后续看看clickhouse的jdbc驱动,这块是否更新,没有更新我可以去提一下[耶]
Mysql表设计推荐
1. INT等整型不要采用无符号的,计算增加会减少时候如果是负数会报错。
2. 自增用8个字节的BIG INT,而不要用四个字节INT,自增在MySQL 8.0前都会有回溯问题。
3. 字符集用UTF8MB4字符编码。
4. 日期类型用DATETIME,精确到毫秒用DATETIME(6),不建议使用INT或TIMESTAMP。
5. 用JSON存储非频繁更新的结构化数据,比如用户标签等。
6. 每张表一定要有一个主键,核心表要有全局唯一字段(比如雪花算法生成id或有序UUID)作为主键。
7. 对日志,监控类的表,可以使用压缩设计,提升存储效率。推荐使用透明页压缩。
8. 敏感字段要加密,动态盐+非固定加密算法( AES256等)+多轮加密。
9. Mysql中通过KV方式访问表中数据,若只是简单的SET和GET,可以转成Memcached的KV方式,减少开销,提升50%左右性
#数据库#





