加速c#中的查询生成器(stringconcat)
本文关键字:stringconcat 查询 加速 | 更新日期: 2023-09-27 18:06:23
我做了一个函数,构建一个查询插入到mysql。上传速度非常快,但插入更长的值需要更长的时间。有没有一种方法可以加速这样的函数?因为我知道循环中的循环会花费很多时间来处理大量的数据。
foreach (string[] st in dataToUpload)
{
buildQuery += " ('";
for (int i = 0; i < st.Length; i++)
{
buildQuery += st[i];
if (i < st.Length - 1)
buildQuery += "','";
}
buildQuery += "')";
if (st != dataToUpload[dataToUpload.Count - 1])
buildQuery += ",";
}
这是我想建立的查询,例如;
string test = INSERT INTO test (test, test1, test2, test3) values
test = test + " " + buildquery;
所以test将是
INSERT INTO test (test, test1, test2, test3)
values ("testvalue1", "testvalue2" , "testvalue3" , "testvalue4"),
("testvalue1", "testvalue2" , "testvalue3" , "testvalue4"),
我可以与INNODB和MYISAM一起工作,它在centos服务器上使用6700k处理器和32gb ram。
所以主要的问题是:我怎样才能使查询的构建更快?
我建议使用StringBuilder,它从一开始就被初始化为正确的大小。这减少了对每个字符串追加的内存重新分配。
假设dataToUpload是一个List,你可以试试:
// String Builder Initialization
// Size is calculated by getting the length of all strings and add 3 for each (',').
// Additionally there are 6 chars for " ('" and "')," per array
StringBuilder build = new StringBuilder(dataToUpload.Sum(data => data.Sum(s => s.Length) + data.Length * 3) + 6);
foreach (string[] st in dataToUpload)
{
build.Append(" ('" + string.Join<string>("','", st) + "'),");
}
buildQuery = build.ToString().TrimEnd(',');
看来你的buildQuery
是String
。试试StringBuilder
吧。这可能是进行字符串连接的最佳方式。
感觉这里需要更多信息,但我想你正在构建这样的插入语句:
INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )
所以,也许在foreach
中不做for
的最好方法是将foreach中的字符串[]替换为具有正确值的字符串。像这样:
var count = 0;
foreach (string st in dataToUpload)
{
buildQuery += " ('" + st + "'") "
if (count++!=0 )
buildQuery += ","
}
可能是:
var count = dataToUpload.Count;
var i = 0;
foreach (string[] st in dataToUpload)
{
buildQuery += " ('" + string.Join(",", st) + "')";
if (i++ < count - 1)
buildQuery += ",";
}
不要将st与dataToUpload的内容进行比较,而是使用索引变量来加快速度。和字符串。连接是连接字符串的好方法。