2009-10-20 47 views
2

我正在測試MySQL作爲SQL服務器的替代品,我遇到了一些非常奇怪的事情。我正在測試插入和讀取,並且每秒最多可以處理大約50個查詢。mysql性能

我的測試表如下所示:

DROP TABLE IF EXISTS `webanalytics`.`test`; 
CREATE TABLE `webanalytics`.`test` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8; 

而我的C#測試程序是這樣的:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using MySql.Data.MySqlClient; 
using System.Diagnostics; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const int QUERY_COUNT = 1000; 
     const string CONNECTION_STRING = "server=localhost;database=WebAnalytics;uid=root;pwd=root"; 

     static void Main(string[] args) 
     { 
      using (var db = new MySqlConnection(CONNECTION_STRING)) 
      { 
       db.Open(); 
       using (var cmd = db.CreateCommand()) 
       { 
        cmd.CommandText = "insert into Test(Name) values (?Name);"; 
        cmd.Parameters.AddWithValue("?Name", ""); 

        var timer = new Stopwatch(); 
        timer.Start(); 

        for (var i = 0; i < QUERY_COUNT; i++) 
        { 
         cmd.Parameters["?Name"].Value = "Test" + i; 
         cmd.ExecuteNonQuery(); 
        } 

        timer.Stop(); 
        var rate = QUERY_COUNT/(timer.ElapsedMilliseconds/1000); 
        Console.WriteLine("Query rate: {0}/s", rate); 
       } 
      } 
     } 
    } 

} 

似乎是一個相當簡單的測試用例。在安裝MySQL時,我使用默認的OLTP標準服務器設置運行32位,但我必須將innodb的緩衝池從2G調整到1G。我不知道瓶頸在哪裏。 MySQL數據連接器越野車?一個dottrace輪廓會議揭示了以下情況:

alt text http://img18.imageshack.us/img18/6812/performance.png

我不知道MySQL的連接器的內部細節,但呼籲mysqldatareader.nextresult迷惑我。爲什麼在執行插入操作時會讀取數據?

+1

什麼是你的MySQL服務器版本?你在MySQL查詢瀏覽器中運行查詢嗎? MySQL的性能不應該那麼慢。如果可能,你可以發佈你的my.ini細節嗎? – Raptor 2009-10-20 03:26:41

+0

這是因爲innodb引擎正在沖洗磁盤而不是緩衝區,正如我在下面對Asaph的評論中指出的那樣。改變一個設置就可以修復它。 – Chris 2009-10-20 04:07:39

回答

5

您正在使用InnoDB表。因此,您應該非常小心地注意可能會影響MySQL數據庫性能的衆多設置。 MySQLPerformanceBlog在InnoDB optimization上有幾個非常好的articles,您應該閱讀。

+1

爲MySQLPerformanceBlog引用+1 ...這兩個帖子非常好。 – 2009-10-20 03:27:33

+1

我曾經看過這個博客,但是我猜,我已經瀏覽了有用的信息。我最終將innodb_flush_log_at_trx_commit = 1更改爲innodb_flush_log_at_trx_commit = 2,並且每秒獲得近1300條查詢。謝謝! – Chris 2009-10-20 03:34:55

0

如果您要更換的SQL Server,我希望你不要用CTE的或他人有用的SQL功能的MySQL沒有......

+1

與OP詢問的內容無關... – MarkR 2009-10-21 18:53:00