【发布时间】:2012-02-09 19:25:14
【问题描述】:
*如果你懒得看描述,你可以在最后找到我的问题......
你好,我建立了一个简单的数据库:
CREATE TABLE `users` (
`id` varchar(45) NOT NULL,
`full_name` varchar(45) NOT NULL,
`first_name` varchar(45) NOT NULL,
`last_nmae` varchar(45) NOT NULL,
`login` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
PRIMARY KEY (`id`,`full_name`,`login`),
UNIQUE KEY `idusers_UNIQUE` (`id`),
UNIQUE KEY `login_UNIQUE` (`login`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
现在我正在测试插入单行的性能。
我用 C# 创建了一个压力工具并将其运行到 1M 行。 如果您有兴趣,这是代码:
abstract class Job
{
private static object synObject = new object();
private static int _id = 0;
private static DateTime startingTime = DateTime.Now;
private const int JOB_PER_SIRCLE = 10;
protected int id;
public Job()
{
lock (synObject)
{
_id++;
id = _id;
}
}
public void run()
{
while (true)
{
for (int i = 0; i < JOB_PER_SIRCLE; i++)
{
doJob();
}
lock (synObject)
{
calculate();
}
}
}
private static DateTime lastLog = DateTime.Now;
private static long numOfJobsAcomplished = 0;
private static long totalNumOfJobsAcomplished = 0;
private static void calculate()
{
totalNumOfJobsAcomplished += JOB_PER_SIRCLE;
numOfJobsAcomplished += JOB_PER_SIRCLE;
DateTime now = DateTime.Now;
TimeSpan timePass = now - lastLog;
if (timePass.TotalSeconds > 1)
{
double total = 1000000;
TimeSpan speed = TimeSpan.FromMilliseconds(timePass.TotalMilliseconds / numOfJobsAcomplished * total);
Console.WriteLine("Speed = " + String.Format("{0:00.0000}", speed.TotalMinutes) + " Completed " + String.Format("{0:00.000}", totalNumOfJobsAcomplished / total * 100) + "% time pass " + (now - startingTime));
lastLog = now;
numOfJobsAcomplished = 0;
}
}
protected abstract void doJob();
}
在 doJob() 方法中,我正在执行插入操作,我正在运行 16 个作业,16 个线程(我发现这是我机器上的最佳性能)
无论如何,我的问题是关于结果的,我需要 85 到 105 分钟来插入 1,000,000 行。这是快还是我应该寻找不同的数据库来使用?
附言 * 当我插入时,我还使用 MD5Crypt 算法进行散列
【问题讨论】:
-
Is this fast是主观的。您的要求和/或限制是什么?负载行为在现实中会是什么样子?表上还会发生哪些其他读取或写入活动?此外,SQL 查询的格式也很重要。您是否使用参数化查询来最小化网络流量、解析和编译时间等? -
@Dems 我只是在使用“插入用户值('...');”
-
查看参数化查询。如果您一次又一次地重复相同的查询,它们的执行速度通常会更快。
-
@Dems 但不是同一个查询,参数在变化
-
某事告诉我
Console.WriteLine花费了大量时间。
标签: mysql sql performance stress-testing