员工出席统计系统 Mysql 建表求助

2021-04-19 17:31:09 +08:00
 LeeReamond

如题,有一加速需求,自己除了遍历之外没什么办法,来 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 、员工人数小于两百,出席天数总计超过十年,包括周六周日。。。

问一下老哥们这种有什么好用的解法吗,我目前这个写法没用上任何索引完全是遍历,感觉慢得出奇,一个搜索执行几分钟。。。

953 次点击
所在节点    问与答
9 条回复
kkkkkrua
2021-04-19 17:42:25 +08:00
10 年,200 员工,算全部记录,一共也才 73W 条记录,为啥不弄成
|时间|员工 id|
|--|--|
|2021-04-19|zhangsan|
|2021-04-19|lisi|
LeeReamond
2021-04-19 17:52:22 +08:00
@kkkkkrua 大佬这个结构之后搜索要怎么搞?不过不太行啊,因为是分部门计算的,每个部门都要搞几十万条
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 字段不就好了么。
按照你那个设计,那表的字段不等于员工数么。。
skymei
2021-04-19 18:04:10 +08:00
你这个需求我第一反应是用位图的交集 差集来做
xiaofeifei8
2021-04-19 18:17:16 +08:00
张三李四出席了,和王五有啥关系,你直接查王五是否出席就完事了啊。

张三|20180101|部门|1|
李四|20180101|部门|0|
LeeReamond
2021-04-19 18:25:50 +08:00
@skymei 一般你自己写服务端的话肯定是,但是因为是数据库,就要涉及到数据库的索引和储存之类的东西了,不是很懂怎么优化
shyrock
2021-04-19 18:35:53 +08:00
把出席状态按位组合成整数,则你的表中记录为[20180101,110][20180102, 110][20180103, 011]这种,在整数列建索引,应该可以比较快查出指定整数出席情况对应的日期来。
acr0ss
2021-04-20 10:51:02 +08:00
楼主的宽表,无法指定添加索引,所以每次都是全表扫描。

如一楼所述,使用 dt, department_id, user_id, attendance 这样的字段方式,可以把索引添加到 user_id 上;这样能加快搜索。
mitsuizzz
2021-04-20 11:19:50 +08:00
这种签到类似的,第一反应用 redis 的 bitmap 去做

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX