2009-10-20 26 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