V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  BiChengfei  ›  全部回复第 22 页 / 共 22 页
回复总数  426
1 ... 13  14  15  16  17  18  19  20  21  22  
2021-08-24 18:39:27 +08:00
回复了 BiChengfei 创建的主题 Java Mybatis 枚举类型处理器扩展之 EnumHandler
@siweipancc 是的,只需要实现接口 TypeHandler 就可
如果是学习,建议自定义枚举类型处理器,很简单的
但真实项目中,这样还是有点点麻烦,我思考了一两周,也和同事讨论过,然后觉得这个扩展有意义,就做了

现在微服务当道,我们项目经常会被拆分成很多子系统,就算我们自定义,最后为了高聚合,也会提取出来,形成一个单独的模块
2021-08-24 17:36:46 +08:00
回复了 BiChengfei 创建的主题 Java Mybatis 枚举类型处理器扩展之 EnumHandler
@jorneyr 哈哈哈,写的越多,bug 越多,不敢多写,不过后续会慢慢完善
2021-08-24 14:58:15 +08:00
回复了 BiChengfei 创建的主题 Java Mybatis 枚举类型处理器扩展之 EnumHandler
这算是一个小插件,来源是公司业务代码的需要,参考了一篇博客: https://segmentfault.com/a/1190000010755321 (简单易懂)
2021-08-24 14:56:20 +08:00
回复了 BiChengfei 创建的主题 Java Mybatis 枚举类型处理器扩展之 EnumHandler
@Martin9 不知道啊,没用过 mybatis plus,有时间看看
2021-07-06 11:35:15 +08:00
回复了 DavZhn 创建的主题 MySQL 不懂就问: mysql 中大数据量日环比计算时间太久
@DavZhn
昨天的思路不太好,缓存你可以考虑。
今天有另一个思路,不知道你表中的 day 的数据格式,不过可以加工下,然后加个 tomorrow 字段,再创建合适索引,查询语句把 order by 去掉(因为 explain 中有 Using filesort,排序可以前端或者后端做一下,不过影响好像不大)
如果原始表结构不能变动,那就新建一个专门来查询的表,以前我们大数据量就是构件冗余表,专门用来查询
本地测试 DDL:
-- day 、add_day 字段都是 yyyy-MM-dd 格式,本地有 6000 条数据,这样改造后,效率从 20 s 变成了 300 ms 内
CREATE TABLE `t_v2_data`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`day` varchar(200) DEFAULT NULL,
`R11` varchar(200) DEFAULT NULL,
`add_day` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_day_R11_add_day` (`day`, `R11`, `add_day`)
) ENGINE = InnoDB AUTO_INCREMENT = 6001 DEFAULT CHARSET = latin1;

查询语句:
SELECT
DATE_FORMAT(t.day, '%d'),
t.R11 as num,
y.R11 ynum,
CASE WHEN y.R11 IS NULL OR y.R11 = 0 THEN 0.00 ELSE round((t.R11/y.R11)-1, 2 ) END cc
FROM
(SELECT day, R11 FROM t_v2_data ) t
left JOIN ( SELECT add_day, R11 FROM t_v2_data ) y ON t.day = y.add_day
where t.day between '2020-5-01' and '2020-5-30'
2021-07-05 11:36:02 +08:00
回复了 DavZhn 创建的主题 MySQL 不懂就问: mysql 中大数据量日环比计算时间太久
我觉得:
1. 可以做一个缓存视图(view),用来保存统计结果,实现:写一个存储过程, 当有数据新增的时候执行统计 sql(你发出来的那个), 然后代码直接从视图中查询结果 -- 这种就是缓存的思路,redis 缓存也可以
2. day 字段加索引(没有测试,我觉得这样会快一点)
```
SELECT
DATE_FORMAT(t.day, '%d'),
t.R11 as num,
y.R11 ynum,
CASE WHEN y.R11 IS NULL OR y.R11 = 0 THEN 0.00 ELSE round((t.R11/y.R11)-1, 2 ) END cc
FROM
(SELECT STR_TO_DATE(day,'%Y-%m-%d') as day, CONVERT(R11, DECIMAL) as R11 FROM 原始数据表 ) t
left JOIN ( SELECT date_add(STR_TO_DATE(day,'%Y-%m-%d'), INTERVAL 1 DAY) as tomorrow, CONVERT(R11, DECIMAL) as R11 FROM 原始数据表 ) y ON t.day = y.tomorrow
where t.day BETWEEN #{startTime} and #{endTime}
order by t.day
```

几百万条数据对 mysql 来说洒洒水啊,完全有优化空间
1 ... 13  14  15  16  17  18  19  20  21  22  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5160 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 14ms · UTC 09:34 · PVG 17:34 · LAX 01:34 · JFK 04:34
Developed with CodeLauncher
♥ Do have faith in what you're doing.