spl 游标问题
我有一个游标读取了文件中的数据,字段姑且就按一个算,就一个主键 id 现在需要为游标添加一个字段 name,但是这个 name 的值需要通过游标的这个主键 id 去数据库链表查表 A, 请问有什么好的方案吗,目前是通过游标.fetch()将所有数据赋值给序表 B, 在用 B.field(“id”) 获取所有 id 的序列,然后再用 select id,name from A where A.id in(所有 id 序列) 获取一个由 name 和 id 构成的序表 C,然后再用 B.join(id,C,name) 去完成需求的,但是这样存在的问题有①为了获取游标的 id 序列,用了 fetch 直接全部取到内存里面了②select 的 in 语句这块如果数据量过大存在问题,可能得考虑分批次③请问老师们会去怎么解决这个需求呢,小白还在边写边补充知识④最后完成以后要将这个包含 id 和 name 的序表在导入到数据库中的表 D, 我目前的想法是先把这个序表导出来,在利用 mysql 的 load date local in file 命令去批量将这个文件的数据直接插入表 D(因为 Mysql 官方说 load date in file 命令比 insert 性能快 20 倍,为了这个命令多了一步把序表导成文件的过程) 想问问老师们的看法,目前数据量是两百万,以后可能还会更高,机器配置内存 16G,cpu8C
去
先不要关注性能和容量问题(也就是只考虑小数据也不要在乎跑得慢),把基本概念理解了,学会实现功能了,再来问某段功能代码是否可以在容量和性能上优化。
不要把问题都堆到一起。现在写的问题也看不懂。
凌晨 3 点半还在发帖“学习”,佩服👍👍
enm,是我描述的不够清晰嘛
id 既是文件中数据的主键又是数据库表 A 的主键?文件和数据库表的数据分别是多少量级的?
说错了, 不好意思文件数据的外键, 数据库表 A 的主键, 文件数据两百万, 数据库表 A 数据量大概是在四百万
从文件读数要比从数据库读数快很多,可以先把文件中的数据按 id 去下重。可以使用这两种方法取出 id 的去重值: 文件序表.id(id) 或文件序表.groups(id)。游标也支持这两个函数,如果只需要读一遍文件的话可以用游标来运算。
用去重后的 id 再对数据库表进行过滤,如果去重后的 id 数量太大无法在 sql 中用 in 过滤,则可以把去重后的 id 拆分成多份,使用多线程从数据库查询。