简单描述就是我有很多条数据,比如:
a = 1, b = 0, c = 1, d = 0
然后我有一堆新数据:
a = 0, b = 1, c = 1, d = 0
我想要把他们合并起来取相对大一些的值,最后得到:
a = 1, b = 1, c = 1, d = 0
现在有 1w 条数据我挨个用子查询判断是 REPLACE 还是 IGNORE,太慢了,精神崩溃
想问问大佬们这种需求一般都是怎么优化处理的
1
caola 2021-02-24 17:49:34 +08:00
a b c d 分成多个字段来存
|
2
kiracyan 2021-02-24 17:49:50 +08:00
a = 1, b = 0, c = 1, d = 0 是什么鬼数据 你先把表结构写清楚
|
3
jintianfengda 2021-02-24 17:51:55 +08:00
意思就是有 a,b,c,d 四个字段,然后每个字段是数值类型,合并的意思是求和?还是取最大?需求还是没看太明白
|
4
JKeita 2021-02-24 17:52:23 +08:00
意思是求每列的最大值?
|
5
haoz1w0w 2021-02-24 17:53:11 +08:00
用程序比较
|
6
l00t 2021-02-24 17:53:16 +08:00
不是很清楚你描述的场景到底是个怎么回事…… 就我的理解,你可以简单聚合一下:
select max(a), max(b), max(c), max(d) from t |
7
philchang1995 2021-02-24 17:59:36 +08:00
同上,按照现在的描述 这几个字段是分开存储的 number 的话 直接用函数就可以了
|
8
gpra8764 OP 是有点没描述清楚,直接上 SQL 直接点:
``` create table xxx ( key tinytext, flag bool ); ``` 现在有数据 ``` (key, flag) values ((a, 1), (b, 0), (c, 1), (d, 0)) (key, flag) values ((a, 0), (b, 1), (c, 1), (d, 0)) ``` a,b,c,d 是 row,大概 1w 行,希望高效的合并出结果 ``` (key, flag) values ((a, 1), (b, 1), (c, 1), (d, 0)) ``` 也就是 a = max(a1, a2) 因为是 bool,每行的 flag 只会有 0 和 1 两个值 |
9
aeli 2021-02-24 18:03:54 +08:00
我理解楼主是说有 1w 条旧数据,有 1w 条新值要根据条件更新?
这种需求 sql 做本身就会比较慢,快一点的方式,就是把旧值查出来,程序里对比一下,然后再批量 update 回去? |
11
gpra8764 OP |
12
aeli 2021-02-24 18:13:35 +08:00
@gpra8764 max 是让 mysql 帮你做了,要生成临时表,要对涉及的行加锁。
反正从你这 0/1 的需求来看,你根本不用比,只更新值为 1 的字段不就行了,不用管旧值是多少。 |
14
dktsy 2021-02-24 18:21:42 +08:00
select key, max(flag) from xxx group by key
楼主是想实现这个吗 |
17
jeeyong 2021-02-25 05:19:40 +08:00
sql 只取值.
所有 a 读出来, 做成一个 list, 排序取最大值, 就算不用任何算法, 1w 得数据量再本地速度应该可以接受.. 依次, 读取 b, 排序取值 或者干脆都读下来, 排序取值.... 可行吗? |