ExtractValue非常慢的XML处理&;mysql中的解析
我们正在使用提取值(XML,xpath)和循环处理大量XML。e、 g.ExtractValue(p_xml,concat(xpath,'/ROOT/TABLE[0]/') 当行数超过数千行时,对数据表的XML处理变得非常缓慢ExtractValue非常慢的XML处理&;mysql中的解析,mysql,xml,database,procedure,Mysql,Xml,Database,Procedure,我们正在使用提取值(XML,xpath)和循环处理大量XML。e、 g.ExtractValue(p_xml,concat(xpath,'/ROOT/TABLE[0]/') 当行数超过数千行时,对数据表的XML处理变得非常缓慢 CALL `MT_PROC` (181, 0, '<ROOT></ROOT>', '<ROOT> <TABLE><keys>f5d29464-e941-4cdf-a21b-984add68dce9</key
CALL `MT_PROC`
(181, 0, '<ROOT></ROOT>', '<ROOT>
<TABLE><keys>f5d29464-e941-4cdf-a21b-984add68dce9</keys></TABLE>
<TABLE><keys>731d23a1-0438-4f72-91a5-83288f6e93b4</keys></TABLE>
<TABLE><keys>c68a4fb8-6306-4728-8b55-f26a151ffad4</keys></TABLE>
<TABLE><keys>3f5ec4bb-2109-4876-a419-b07b553081cc</keys></TABLE>
<TABLE><keys>4689bc20-9eec-4f6b-a454-9a30b7080cc2</keys></TABLE>
<TABLE><keys>466a7da5-7a9e-419f-b1fc-dcd57931a095</keys></TABLE>
....20K rows
</ROOT>')
调用'MT_PROC`
(181, 0, '', '
f5d29464-e941-4cdf-a21b-984添加68DCE9
731d23a1-0438-4f72-91a5-83288f6e93b4
c68a4fb8-6306-4728-8b55-f26a151ffad4
3f5ec4bb-2109-4876-a419-b07b553081cc
4689bc20-9eec-4f6b-a454-9a30b7080cc2
466a7da5-7a9e-419f-b1fc-dcd57931a095
……2万行
')
这个问题的解决方案是什么。使用直接插入而不是提取值来加快xml处理速度。 使用查询直接在表中插入数据,如下所示
if p_xml is not null and p_xml <> '<ROOT></ROOT>'
then
/*set CountMAX = ExtractValue(p_xml, 'count(/ROOT/TABLE)');
set Counter=1;
while(Counter<=CountMAX) DO
set xpath=concat('/ROOT/TABLE[',Counter,']/');
-- inserting values into the temp table
INSERT INTO select_keys(report_key) Values (
ExtractValue(p_xml, concat(xpath,'report_key'))
);
set Counter = Counter + 1;
END WHILE;
*/
set p_xml = replace(replace(p_xml,'<TABLE><report_key>','('''),'</report_key></TABLE>','''),');
set p_xml = replace(replace(p_xml,'<ROOT>',''),',</ROOT>','');
set @stmt_str = concat('INSERT INTO select_keys(report_key) values ' ,p_xml);
prepare stmt from @stmt_str;
execute stmt;
deallocate prepare stmt;
END If;
如果p_xml不为null且p_xml“”
然后
/*设置CountMAX=ExtractValue(p_xml,'count(/ROOT/TABLE');
设置计数器=1;
而(Counter您提供的答案很容易受到MySQL注入攻击。我也在研究如何在从xml提取值时提高性能。但是连接字符串以创建命令似乎是自找麻烦
仅举一个此类攻击的示例(已测试)
如果用户可以通过某种方式操纵xml中的值,恶意用户可能会提供类似以下内容的值:
normalvaluehere\');select * from atablehere--
(末尾有空格)将导致
select * from atablehere
正在执行
你们找到另一种方法了吗
谢谢
select * from atablehere