求 mysql中 速度最快的分割字符串方法?解决办法
求 mysql中 速度最快的分割字符串方法??
今有 一万个手机号码已 " ;" 分割符连接的字符串,需要在存储过程中,需要将所有号码添加到另外一个表中,并且号码需要分开(既每个手机号码为一行)。有没有快捷的方法?
下面是目前采用的方法:
一万条需要 20s 很慢,如果大量,用户并发操作就更加慢了
------解决方案--------------------
这样的需求,直接用一句SQL是无法处理的,基本上像你那样写个存储过程来处理(也可以写程序用程序处理)。
至于你说的“如果大量,用户并发操作就更加慢了 ”,那可以在存储过程里面的循环那部分用的是个临时表(有利于独立会话,减少竞争),然后循环处理完成后,在存储过程尾部一次性把临时表里面的所有记录插入到正式表中去(批量提交,会提高速度不少,同时减少并发竞争)。
------解决方案--------------------
set t_MCODE=substring(t_MCODE,t_i+1,length(t_MCODE)-t_i);
这个操作比较浪费时间。 不要复制这个文本串。换个思路。
iPosCur, iPosNext 得到当前的 ; 位置iPosCur,,然后 找 iPosCur 后下一个; 的位置 iPosNext, 取 iPosCur, iPosNext 的字符串为号码,再 set iPosCur = iPosNext ; 再继续循环。
10,000 个号码 * 11 = 110,000 字节的字符串你的程序中复制了太多的次数!
------解决方案--------------------
这种思路会不会快一点。
===============================================================================
今有 一万个手机号码已 " ;" 分割符连接的字符串,需要在存储过程中,需要将所有号码添加到另外一个表中,并且号码需要分开(既每个手机号码为一行)。有没有快捷的方法?
下面是目前采用的方法:
- SQL code
set t_MCODE=ltrim(t_code); /* t_code 为号码字符串 */ set t_MCODE=rtrim(t_MCODE); set t_i=POSITION(';' in t_MCODE); WHILE t_i >=1 do set str=left(t_MCODE,t_i-1); set str=ltrim(str) ; set str=rtrim(str); insert test(names) values(str); set t_MCODE=substring(t_MCODE,t_i+1,length(t_MCODE)-t_i); set t_i=POSITION(';' in t_MCODE); end WHILE ;/*把号码插入表*/ insert test(names) values(t_MCODE); /*将最后剩余的号码放入临时表*/
一万条需要 20s 很慢,如果大量,用户并发操作就更加慢了
------解决方案--------------------
这样的需求,直接用一句SQL是无法处理的,基本上像你那样写个存储过程来处理(也可以写程序用程序处理)。
至于你说的“如果大量,用户并发操作就更加慢了 ”,那可以在存储过程里面的循环那部分用的是个临时表(有利于独立会话,减少竞争),然后循环处理完成后,在存储过程尾部一次性把临时表里面的所有记录插入到正式表中去(批量提交,会提高速度不少,同时减少并发竞争)。
------解决方案--------------------
set t_MCODE=substring(t_MCODE,t_i+1,length(t_MCODE)-t_i);
这个操作比较浪费时间。 不要复制这个文本串。换个思路。
iPosCur, iPosNext 得到当前的 ; 位置iPosCur,,然后 找 iPosCur 后下一个; 的位置 iPosNext, 取 iPosCur, iPosNext 的字符串为号码,再 set iPosCur = iPosNext ; 再继续循环。
10,000 个号码 * 11 = 110,000 字节的字符串你的程序中复制了太多的次数!
------解决方案--------------------
这种思路会不会快一点。
===============================================================================
- SQL code
mysql> set @b = '123;234;567;789'; Query OK, 0 rows affected (0.00 sec) mysql> set @a = concat(concat("insert into x values('",replace(@b,';',"'),('"))," ')"); Query OK, 0 rows affected (0.00 sec) mysql> select @a; +----------------------------------------------------+ | @a | +----------------------------------------------------+ | insert into x values('123'),('234'),('567'),('789') | +----------------------------------------------------+ 1 row in set (0.00 sec)
------解决方案--------------------
------解决方案--------------------
set @a = concat(concat("insert into xvalues('",replace(@b,';',"'),('")),"')");
----------这都什么意思啊,格式方面都看不太懂。。。。。
"insert into xvalues('",replace(@b,';',"'),('")),"'
------解决方案--------------------
可以使用xml处理。
microsoft sql server 中支持 xml很好。
不知道mysql怎样。
先处理成可执行的xml,然后一条语句就可以处理。
说的不对的话,请大家见谅。
------解决方案--------------------
mysql> set @b = '123;234;567;789';
Query OK, 0 rows affected (0.00 sec)
mysql> set @a = concat(concat("insert into x values('",replace(@b,';',"'),('")),"
')");
Query OK, 0 rows affected (0.00 sec)
mysql> select @a;