
简单描述就是我有很多条数据,比如:
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 zzvgtiger 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, 排序取值 或者干脆都读下来, 排序取值.... 可行吗? |