我正在测试MySQL作为SQL Server的替代产品,并且遇到了一些非常奇怪的事情。我正在测试插入和读取,并且以任何一种方式每秒最多处理约50个查询。
我的测试表如下所示:
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的安装中,尽管我必须将innodb的缓冲池从2G降低到1G,但我正在使用默认OLTP标准服务器设置运行32位。我不知道瓶颈在哪里。MySQL数据连接器是否有故障?dottrace概要文件会话显示以下内容:
替代文字http://img18.imageshack.us/img18/6812/performance.png
我不知道MySQL连接器的内部细节,但是对mysqldatareader.nextresult的调用使我感到困惑。当我执行插入操作时,为什么读取?
您正在使用InnoDB表。因此,您应该非常注意可能影响或破坏MySQL数据库性能的众多设置。MySQLPerformanceBlog有一些关于InnoDB优化的非常好的文章,您应该阅读。