*如果你是懶得看,你可以找到我的最終問題的說明...MySQL的插入性能stressTool
您好,我建立一個簡單的數據庫:
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行。這是否很快,或者我應該尋找不同的數據庫來處理?
P.S *當我將我也MD5Crypt算法散列
'這是否快速'是主觀的。你的要求和/或限制是什麼?負載行爲在現實中會是什麼樣子?桌子上還有什麼其他的閱讀或寫作活動?此外,SQL查詢的格式也很重要。您是否使用參數化查詢來最小化網絡流量,解析和編譯時間等? – MatBailie 2012-01-13 15:49:34
@Dems我只是使用「插入到用戶值('...');」 – 2012-01-13 15:57:48
查看參數化查詢。如果您一次又一次地重複相同的查詢,他們通常執行得更快。 – MatBailie 2012-01-13 15:58:42