Соединения с БД в ASP.NET, MySQL против SQL Server - PullRequest
4 голосов
/ 29 января 2009

Я использую MySQL в проекте ASP.NET, над которым я сейчас работаю, я провел несколько тестов для проверки производительности поставщика MySQL .NET, но, к сожалению, я не очень доволен результатами.

Очень простой цикл, который только открывает соединение, был в 10 раз быстрее в SQL Server:

// MySQL

const string CONNECTION_STRING = 
"server=localhost;database=testdb;user id=root;password=mypassword;max pool size=250;";
for (int i = 0; i < 5000; i++)
{
  using (MySqlConnection con = new MySqlConnection(CONNECTION_STRING))
  {
    con.Open();
  }
}

// SQL Server

const string CONNECTION_STRING = "Data Source=localhost;Initial Catalog=testdb;Integrated Security=True;max pool size=250;";
for (int i = 0; i < 5000; i++)
{
  using (SqlConnection con = new SqlConnection(CONNECTION_STRING))
  {
    con.Open();
  }
}

SQL Server намного быстрее во всем остальном (выбор, обновление, вставка и т. Д.). Я делаю что-то не так? Есть ли какие-либо переменные сервера, которые я должен изменить?

Подробнее:
- Я запускаю MySQL в Windows (5.0.51a-community-nt)
- SQL Server 2005 использовался в тесте
- Технические характеристики: Windows XP SP2, двухъядерный процессор Intel 1,6 ГГц, 1024 МБ ОЗУ

Это конфигурация MySQL:

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8

server-id   = 1

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

Спасибо за любые предложения ...

Ответы [ 3 ]

4 голосов
/ 29 января 2009

SQL-сервер по умолчанию использует пул соединений: каждое соединение, открытое с одинаковой строкой соединения, возвращается в пул при закрытии. Возврат соединения из пула намного эффективнее, чем создание соединения с нуля. Я предполагаю, что MySql не обеспечивает пул соединений по умолчанию

2 голосов
/ 29 апреля 2009

Нужно подумать о том, как был установлен mySQL, вы сказали, что сервер был выделенным сервером БД или рабочей станцией? MySQL может быть сконфигурирован так, чтобы ограничивать себя, чтобы он не конфликтовал с другими сервисами или использовал то, что доступно. SQL Server будет использовать любые ресурсы, которые он считает нужными. Я хотел бы посмотреть, как настроен ваш сервер MySQL, есть хороший шанс, что вы можете получить некоторые улучшения производительности там.

Наконец, Windows не является предпочтительной платформой для MySQL, она поддерживается, но если вы действительно хотите, чтобы она выполнялась, поместите ее в систему Linux, где вы можете настроить файловую систему и т. Д., Чтобы добиться максимальной производительности, чего-то, что SQL Сервер просто не может сделать

вот ссылка на некоторые статьи, блоги, книги и т. Д. Для настройки производительности mysql
http://forums.mysql.com/read.php?24,92131,92131

0 голосов
/ 29 января 2009

Это может быть пул соединений, но вы также должны учитывать тот факт, что когда код .NET общается с Sql Server, он обменивается данными с использованием наиболее эффективных каналов, поскольку весь код принадлежит и контролируется Microsoft. Если код .NET общается со сторонним сервером или какой-то сторонний код общается с Sql Server, связь должна быть более стандартизированной и общей, поэтому она намного медленнее.

Вот почему во время войн "Pet Shop" решение ASP.NET всегда работало намного быстрее, чем альтернативные решения. Когда вы вынуждены быть независимыми от платформы, вы не можете идти в ногу со 100% нативным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...