mysql中怎样对大批量级的数据查询进行优化?
mysql一直支持正则匹配,但直到mysql8.0才支持正则替换。以前这种场景要么在mysql端处理,要么在应用端取出数据进行处理。
例如,我想用dble替换表y1的str1列中第三个操作的子字符串。如何实现这一点?
1.自己写sql层存储函数。代码是这样写的:3dead,没有优化,只是作为演示,在mysql中非常不鼓励写这样的函数。
关系型数据库
分隔符$$
使用;ytt`$$
如果存在,则删除函数`func_instr_simple_ytt`$$
createdefiner`root`@`localhost`func_instr_simple_ytt`(
f_strvarchar(1000),-参数1
f_substrvarchar(100),-参数2
f_replace_strvarchar(100),
f_timesint-times支持3。
)返回varchar(1000)
开始
声明v_resultvarchar(1000)默认ytt-result。
声明v_substr_lenintdefault0-搜索字符串长度。
设置f_times3-仅支持3。
设置v_substr_len长度(f_substr)
selectinstr(f_str,f_substr)into@p1-第一个实际位置。
selectinstr(substr(f_str,@p1v_substr_len),f_substr)进入@p2次虚拟位置。
selectinstr(substr(f_str,@p2@p12*v_substr_len-1),f_substr)into@p3-第三个虚拟位置。
如果@p1gt0安培@p2gt0安培@p3gt0,那么-好。
挑选
concat(substr(f_str,1,@p1@p2@p3(f_times-1)*v_substr_len-f_times)
,f_replace_str,
substr(f_str,@p1@p2@p3f_times*v_substr_len-2))转换为v_result
其他
setv_resultf_str-从未更改。
如果…就会结束
-清除所有会话变量。
set@p1null
set@p2null
set@p3null
返回v_结果
结束
$$
定界符
-调用函数进行更新:
mysqlgt更新y1设置str1func_instr_simple_ytt(str1,action,dble,3)
查询正常,20行受影响(0.12秒)
排match:20chang:20warnings:0
2.使用sed等工具导出以替换导入。步骤如下:(推荐)1)导出表y1中的记录。
mysqlmysqlgtselect*fromy1intooutfile/var/lib/mysql-files/y1.csvqu:/var/lib/mysql-files#sed-is/action/dble/3y1.csv
3)再次导入处理后的数据并完成。
关系型数据库
mysqlgt截断y1
查询正常,0行受影响(0.99秒)
mysqlgt将file/var/lib/mysql-files/y1.csv中的数据加载到表y1中
查询正常,20行受影响(0.14秒)
records:20d:0skipp:0
以上两种推荐出口再加工再进口,性能更高,你不你不必自己编写功能代码。然后mysql8.0很简单的实现了上面的场景,一个功能就搞定了。
mysqlmysqlgtupdatey1setstr1regexp_replace(str1,action,dble,1,3)查询正常,20行受影响(0.13秒)行match:20chang:20warnings:0
还有一个regexp_instr非常有用,特别是指出现的次数。例如,定义会话变量@a。
mysqlmysqlgtset@aaabbcceefilucy111bs234523556119101020301040查询正常,0行受影响(0.04秒)
获取该数字至少出现两次的第二个子字符串的位置。
mysqlmysqlgtselectr:digitech14-@.com]{2,},1,2)-|r:digitech16-@.com]{2,},1,2)|-|50|-集合中的1行(0.00秒)
那么让我们让我们看看如何支持多字节字符。
关系型数据库
mysqlgtset@a美国俄罗斯日本北京上海深圳广州上海武汉东莞北京青岛北京。
查询正常,0行受影响(0.00秒)
mysqlgtselectregexp_instr(@a,beijing,1,1)
-
|regexp_instr(@a,北京,1,1)|
-
|17|
-
集合中的1行(0.00秒)
mysqlgtselectregexp_instr(@a,beijing,1,2)
-
|regexp_instr(@a,beijing,1,2)|
-
|29|
-
集合中的1行(0.00秒)
mysqlgtselectregexp_instr(@a,beijing,1,3)
-
|regexp_instr(@a,beijing,1,3)|
-
|41|
-
集合中的1行(0.00秒)
综上,我提到了mysql8.0最有用的两个正则匹配函数,regexp_replac
awk怎么删除?
战略经济对话..e/[替换为string,don不写也不删]/g上面的文件名就是找一个类似**e的字符串,也可以写其他正则表达式,删除或者替换awk:awk{gsub(/a..e/,替换内容或为空);print}的文件名同上,删除功能可以通过将替换项写成空字符串来实现。
原文标题:sed在包含的字符串前加内容 mysql中怎样对大批量级的数据查询进行优化?,如若转载,请注明出处:https://www.bjhtrmyl.com/tag/26423.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「亨通号」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。