V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  BiChengfei  ›  全部回复第 15 页 / 共 15 页
回复总数  288
1 ... 6  7  8  9  10  11  12  13  14  15  
@l00t 这不是本科《数据库原理》中的 demo 吗?我会写,我是不是面试通过了,嘿嘿嘿
create table t_student (
id integer primary key ,
name varchar(40)
);

create table t_course (
id integer primary key ,
course varchar(40)
);

create table t_grade (
id integer primary key ,
student_id integer,
course_id integer,
grade integer
);

insert into t_student(id, name) values (1, '张三');
insert into t_student(id, name) values (2, '王五');
insert into t_student(id, name) values (3, '小李');
insert into t_student(id, name) values (4, '王华');

insert into t_course(id, course) values ( 1, '数学' );
insert into t_course(id, course) values ( 2, '语文' );
insert into t_course(id, course) values ( 3, '英语' );
insert into t_course(id, course) values ( 4, '化学' );
insert into t_course(id, course) values ( 5, '物理' );

insert into t_grade(id, student_id, course_id, grade) values ( 1, 1, 1, 100 );
insert into t_grade(id, student_id, course_id, grade) values ( 2, 1, 2, 80 );
insert into t_grade(id, student_id, course_id, grade) values ( 3, 1, 3, 10 );
insert into t_grade(id, student_id, course_id, grade) values ( 4, 1, 4, 100 );
insert into t_grade(id, student_id, course_id, grade) values ( 5, 1, 5, 100 );

insert into t_grade(id, student_id, course_id, grade) values ( 6, 2, 1, 100 );
insert into t_grade(id, student_id, course_id, grade) values ( 7, 2, 1, 100 );
insert into t_grade(id, student_id, course_id, grade) values ( 8, 2, 1, 100 );
insert into t_grade(id, student_id, course_id, grade) values ( 9, 2, 1, 100 );
insert into t_grade(id, student_id, course_id, grade) values ( 10, 2, 1, 100 );

select
a.student_id,
b.name
from t_grade a
left join t_student b on a.student_id = b.id
left join t_course c on a.course_id = c.id
group by a.student_id
having min(a.grade) >= 80
2021-08-25 10:09:32 +08:00
回复了 BiChengfei 创建的主题 Java Mybatis 枚举类型处理器扩展之 EnumHandler
@lululau 参考 mybatis 和 spring mvc 对枚举的处理,枚举名(字符串)应该是最标准的
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 ... 6  7  8  9  10  11  12  13  14  15  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2127 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 17ms · UTC 04:54 · PVG 12:54 · LAX 21:54 · JFK 00:54
Developed with CodeLauncher
♥ Do have faith in what you're doing.