需求:数据库字段point存储经纬度:116,39,逗号隔开,现在要拆分开 分别存入lon lat
方式1:使用java 代码
全部读入内存-----split(",")-------setLon setLat ---------updateById
经过测试,11W数据,耗时3小时以上,且容易内存溢出
方式2:使用mysql存储过程
-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除
DROP PROCEDURE IF EXISTS init_reportUrl;
-- 创建存储过程
CREATE PROCEDURE init_reportUrl()
BEGIN
-- 定义变量
DECLARE s int DEFAULT 0;
DECLARE temp_id int(10); -- 这个变量是用来放游标里的变量数据的
DECLARE temp_point varchar(256); -- 这个变量是用来放游标里的变量数据的
DECLARE a1 VARCHAR(122);
DECLARE a2 VARCHAR(122);
-- 定义游标,并将sql结果集赋值到游标中
DECLARE report CURSOR FOR select id,point from good_food; -- 定义游标去拿哪些字段数据
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
open report;
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
fetch report into temp_id,temp_point; -- 游标拿到一条,给上面声明的变量赋值
-- 当s不等于1,也就是未遍历完时,会一直循环
while s<>1 do
-- 执行业务逻辑
SELECT SUBSTRING_INDEX(temp_point,',',1) into a1; -- 将函数结果 写入a1
SELECT SUBSTRING_INDEX(temp_point,',',-1) into a2;-- 将函数结果 写入 a2
update good_food set lon = a1,lat = a2 where id=temp_id; -- 修改lon=a1 lat =a2 条件是id=temp_id ,temp_id是游标当前拿到的那一条数据的id
-- 将游标中的值再赋值给变量,供下次循环使用
fetch report into temp_id,temp_point;
-- 当s等于1时表明遍历以完成,退出循环
end while;
-- 关闭游标
close report;
END;
-- 调用存储过程 不调用不会执行
call init_reportUrl()
经过测试 :12W数据,修改耗时30s
方式3:使用老式jdbc ,通过游标获取next 的方式
还没测试
方式4:使用sql 直接update
xx_fbr:需要拆分的字段 xx_title xx_content 需要赋值的字段
update xx_system set xx_title=SUBSTRING_INDEX(xx_fbr,',',1),xx_content=SUBSTRING_INDEX(xx_fbr,',',-1) where trim(xx_fbr) is not null
总结:sql 存储过程都比较快 但 这里用存储过程有点太繁重