如题,有一加速需求,自己除了遍历之外没什么办法,来 v2 问问老哥
具体需求:
1 、我司有若干员工,目前有一张表内有日期,员工 A,员工 B,员工 C....若干列,第一列是日期,之后每列记录该员工该日是否出席,大概类似下面这样
-------------------------------------
| 日期 | 张三 | 李四 | 王五 | ...
-------------------------------------
| 20180101 | 1 | 1 | 0 | ...
-------------------------------------
| 20180102 | 1 | 1 | 0 | ...
-------------------------------------
| 20180103 | 0 | 1 | 1 | ...
-------------------------------------
| ...
-------------------------------------
表中用 1 和 0 代表该日是否出席
2 、查询需求是,比如“统计张三和李四都出席了,但王五没出席的日期”,select date where a1=1 and a2=1 and a3=0
这种的,特殊的是这个语句需要支持由用户自定义且可能有嵌套,实际执行搜索可能是这样的
select date from ... where a1=1 and a2=1 and (a3=0 or a4=0)
3 、员工人数小于两百,出席天数总计超过十年,包括周六周日。。。
问一下老哥们这种有什么好用的解法吗,我目前这个写法没用上任何索引完全是遍历,感觉慢得出奇,一个搜索执行几分钟。。。
1
kkkkkrua 2021-04-19 17:42:25 +08:00
10 年,200 员工,算全部记录,一共也才 73W 条记录,为啥不弄成
|时间|员工 id| |--|--| |2021-04-19|zhangsan| |2021-04-19|lisi| |
2
LeeReamond OP @kkkkkrua 大佬这个结构之后搜索要怎么搞?不过不太行啊,因为是分部门计算的,每个部门都要搞几十万条
|
3
kkkkkrua 2021-04-19 18:02:27 +08:00
@LeeReamond #2
select date from tale where employeeId!='wangwu' and employeeIdin ('zhangsan','lisi') group by date having count(*)=2 没理解分部门是啥意思,再加个部门 id 字段不就好了么。 按照你那个设计,那表的字段不等于员工数么。。 |
4
skymei 2021-04-19 18:04:10 +08:00
你这个需求我第一反应是用位图的交集 差集来做
|
5
xiaofeifei8 2021-04-19 18:17:16 +08:00
张三李四出席了,和王五有啥关系,你直接查王五是否出席就完事了啊。
张三|20180101|部门|1| 李四|20180101|部门|0| |
6
LeeReamond OP @skymei 一般你自己写服务端的话肯定是,但是因为是数据库,就要涉及到数据库的索引和储存之类的东西了,不是很懂怎么优化
|
7
shyrock 2021-04-19 18:35:53 +08:00 1
把出席状态按位组合成整数,则你的表中记录为[20180101,110][20180102, 110][20180103, 011]这种,在整数列建索引,应该可以比较快查出指定整数出席情况对应的日期来。
|
8
acr0ss 2021-04-20 10:51:02 +08:00 1
楼主的宽表,无法指定添加索引,所以每次都是全表扫描。
如一楼所述,使用 dt, department_id, user_id, attendance 这样的字段方式,可以把索引添加到 user_id 上;这样能加快搜索。 |
9
mitsuizzz 2021-04-20 11:19:50 +08:00
这种签到类似的,第一反应用 redis 的 bitmap 去做
|