extractvalue在mysql中处理和解析xml的速度非常慢

30byixjq  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(442)

我们正在使用extractvalue(xml,xpath)和循环处理大量xml。e、 g.extractvalue(p\u xml,concat(xpath,'/root/table[0]/'),

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

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

  1. CALL `MT_PROC`
  2. (181, 0, '<ROOT></ROOT>', '<ROOT>
  3. <TABLE><keys>f5d29464-e941-4cdf-a21b-984add68dce9</keys></TABLE>
  4. <TABLE><keys>731d23a1-0438-4f72-91a5-83288f6e93b4</keys></TABLE>
  5. <TABLE><keys>c68a4fb8-6306-4728-8b55-f26a151ffad4</keys></TABLE>
  6. <TABLE><keys>3f5ec4bb-2109-4876-a419-b07b553081cc</keys></TABLE>
  7. <TABLE><keys>4689bc20-9eec-4f6b-a454-9a30b7080cc2</keys></TABLE>
  8. <TABLE><keys>466a7da5-7a9e-419f-b1fc-dcd57931a095</keys></TABLE>
  9. ....20K rows
  10. </ROOT>')

这个问题的解决办法是什么。

fwzugrvs

fwzugrvs1#

您提供的答案易受mysql注入攻击。我还研究了如何在从xml中提取值时提高性能。但是连接字符串来创建命令似乎是自找麻烦。。
只是给你举一个这样的攻击的例子(测试)
如果用户可以通过某种方式操纵xml中的值,恶意用户可能会提供类似以下内容的值:

  1. normalvaluehere\');select * from atablehere--

(结尾有空格)会导致

  1. select * from atablehere

正在执行。
你们找到别的方法了吗?
谢谢!

pgx2nnw8

pgx2nnw82#

通过直接插入而不是提取值来加快xml处理速度。使用query直接在表中插入数据,如下所示。

  1. if p_xml is not null and p_xml <> '<ROOT></ROOT>'
  2. then
  3. /*set CountMAX = ExtractValue(p_xml, 'count(/ROOT/TABLE)');
  4. set Counter=1;
  5. while(Counter<=CountMAX) DO
  6. set xpath=concat('/ROOT/TABLE[',Counter,']/');
  7. -- inserting values into the temp table
  8. INSERT INTO select_keys(report_key) Values (
  9. ExtractValue(p_xml, concat(xpath,'report_key'))
  10. );
  11. set Counter = Counter + 1;
  12. END WHILE;
  13. */
  14. set p_xml = replace(replace(p_xml,'<TABLE><report_key>','('''),'</report_key></TABLE>','''),');
  15. set p_xml = replace(replace(p_xml,'<ROOT>',''),',</ROOT>','');
  16. set @stmt_str = concat('INSERT INTO select_keys(report_key) values ' ,p_xml);
  17. prepare stmt from @stmt_str;
  18. execute stmt;
  19. deallocate prepare stmt;
  20. END If;

展开查看全部

相关问题