繁体   English   中英

ExtractValue 在 mysql 中非常慢的 XML 处理和解析

[英]ExtractValue very slow XML processing & Parsing in mysql

我们正在使用ExtractValue(xml,xpath)处理大量XML,并在我们的 XML 上循环。 例如 ExtractValue(p_xml, concat(xpath,'/ROOT/TABLE[0]/')),

While (20k)
 INSERT INTO select_keys(key)
 Values (ExtractValue(p_xml, concat(xpath,'key',[counter])));
End While

当行数超过数千时,对数据表的 XML 处理变得非常缓慢。

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>') 

这个问题的解决方案是什么。

您提供的答案容易受到 MySQL 注入攻击。 我也在研究从 xml 中提取值时如何提高性能。 但是连接字符串来创建命令似乎是在自找麻烦..

只是给你一个这种攻击的例子(经过测试)

如果用户可以以某种方式操纵 xml 中的值,恶意用户可能会提供类似于以下内容的值:

normalvaluehere\');select * from atablehere-- 

(末尾有一个空格)将导致

select * from atablehere 

被处决。

你们有没有找到另一种方法来做到这一点?

谢谢!

使用直接插入而不是 ExtractValue 加快 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;

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM