C# 中的加速查询生成器 ( stringconcat )
Speedup querybuilder ( stringconcat ) in c#
我创建了一个函数来构建查询以插入 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;
所以测试将是
INSERT INTO test (test, test1, test2, test3)
values ("testvalue1", "testvalue2" , "testvalue3" , "testvalue4"),
("testvalue1", "testvalue2" , "testvalue3" , "testvalue4"),
我可以使用 INNODB 和 MYISAM,它在 centos 服务器上工作,它有 6700k 处理器和 32gb 内存。
所以主要问题是:我怎样才能更快地构建查询?
感觉这里需要更多信息,但我想您正在构建这样的插入语句:
INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )
因此,也许不在 foreach
中执行 for
的最佳方法是替换 foreach 中的 string[],以获得具有正确值的字符串。像这样:
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 的内容进行比较,而是使用索引变量来加快速度。
string.Join 是连接字符串的好方法。
我建议使用 StringBuilder,它从一开始就被初始化为正确的大小。这减少了每个字符串附加的内存重新分配。
假设 dataToUpload 是一个列表,您可以试试这个:
// 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
。这可能是进行字符串连接的最佳方式。
我创建了一个函数来构建查询以插入 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;
所以测试将是
INSERT INTO test (test, test1, test2, test3)
values ("testvalue1", "testvalue2" , "testvalue3" , "testvalue4"),
("testvalue1", "testvalue2" , "testvalue3" , "testvalue4"),
我可以使用 INNODB 和 MYISAM,它在 centos 服务器上工作,它有 6700k 处理器和 32gb 内存。
所以主要问题是:我怎样才能更快地构建查询?
感觉这里需要更多信息,但我想您正在构建这样的插入语句:
INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )
因此,也许不在 foreach
中执行 for
的最佳方法是替换 foreach 中的 string[],以获得具有正确值的字符串。像这样:
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 的内容进行比较,而是使用索引变量来加快速度。 string.Join 是连接字符串的好方法。
我建议使用 StringBuilder,它从一开始就被初始化为正确的大小。这减少了每个字符串附加的内存重新分配。
假设 dataToUpload 是一个列表,您可以试试这个:
// 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
。这可能是进行字符串连接的最佳方式。