求 mysql中 速度最快的分割字符串方法??

Posted on

求 mysql中 速度最快的分割字符串方法??

CSDN-CSDN社区-其他数据库开发-MySQL/Postgresql

收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 [推荐] 求 mysql中 速度最快的分割字符串方法??[问题点数:20分]

  • doney_dongxiang
  • (doney) *
  • 等 级:
  • 结帖率:93.02%
  • 楼主发表于:2009-10-20 15:42:21 今有 一万个手机号码已 " ;" 分割符连接的字符串,需要在存储过程中,需要将所有号码添加到另外一个表中,并且号码需要分开(既每个手机号码为一行)。有没有快捷的方法? 下面是目前采用的方法: SQL codeset 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 很慢,如果大量,用户并发操作就更加慢了 * 对我有用[0]

10 16 /#1楼 得分:0回复于:2009-10-20 15:48:01 1、贴记录及要求结果出来看看; 2、有SQL,对字符操作速度不会快; 3、建议修改成列的形式 号码1 号码2 ... 号码n * 对我有用[0]

  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP * vinsonshen用户头像
  • vinsonshen
  • (阿呢陀佛,一切皆空) *
  • 等 级:
  • 2 /#2楼 得分:0回复于:2009-10-20 15:48:20 大致思路就像你这样来处理了。 * 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP * vinsonshen用户头像
  • vinsonshen
  • (阿呢陀佛,一切皆空) *
  • 等 级:
  • 2 /#3楼 得分:0回复于:2009-10-20 15:54:18 这样的需求,直接用一句SQL是无法处理的,基本上像你那样写个存储过程来处理(也可以写程序用程序处理)。 至于你说的“如果大量,用户并发操作就更加慢了 ”,那可以在存储过程里面的循环那部分用的是个临时表(有利于独立会话,减少竞争),然后循环处理完成后,在存储过程尾部一次性把临时表里面的所有记录插入到正式表中去(批量提交,会提高速度不少,同时减少并发竞争)。 * 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP * ACMAIN_CHM用户头像
  • ACMAIN_CHM
  • (acmain) *
  • 等 级:
  • 2

9 /#4楼 得分:0回复于:2009-10-20 16:02:48 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 字节的字符串你的程序中复制了太多的次数! 对我有用[0]

6

3 /#5楼 得分:0回复于:2009-10-20 17:27:18 这种思路会不会快一点。

SQL codemysql> 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) 然后prepare,execute. * 对我有用[0]

9 /#7楼 得分:0回复于:2009-10-20 18:59:26 /#5楼 快慢没试过,不过的确另人耳目一新。 * 对我有用[0]

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途