Столкнулся с такой необходимостью: обеспечить создание 100 (сравнительно простых) записей в секунду в реляционную базу данных. И, к моему удивлению, MySQL
при использовании из .Net уже с этим не справляется.
Дабы не быть абстрактным, опишу детальнее свой эксперимент:
Железо
ОЗУ 2 Гб, Процессор Celeron 2-ядра, 1.87 ГГц.
Софт
Windows 7 Ultimate 32. Последняя версия MySQL с настройками по умолчанию (при установке выбрал режим «машина разработчика»). Коннектор с официального сайта.
ORM — EntityFramework.
Таблица в базе данных (2 поля):
Id int identity primarykey,
Value text
Код. Для тестов использовался один и тот же код (для всех баз данных), изменена только строка подключения. Вот сам код:
namespace CodeFirstProj
{
public class TestEntity
{
public int Id { get; set; }
public string Value { get; set; }
}
class Program
{
public class TestContext : DbContext
{
public TestContext()
: base("postgreSQL")
{
}
public DbSet TestEntitySet { get; set; }
}
static void Main(string[] args)
{
// Размер константы 2000 символов
const string value = "01234567890...";
using(var testContext = new TestContext())
{
Console.WriteLine(DateTime.Now.ToString()); // можно и Stopwatch, но это ничего не изменит
for (int i = 0; i < 1000; i++)
{
var testEntity = new TestEntity();
testEntity.Value = value + i;
testContext.TestEntitySet.Add(testEntity);
testContext.SaveChanges();
}
Console.WriteLine(DateTime.Now.ToString());
}
}
}
}
* This source code was highlighted with Source Code Highlighter.
Размер вставляемой записи (строка) — 2 тыс. символов (2 Кб).
Вот такие результаты (код использования один и тот же):
MySQL: 20 записей в секунду
PostgreSQL: 100 записей в секунду (для сравнения)
MS SQL Express: 166 записей в секунду (для сравнения)
Я так понимаю проблема в коннекторе, сама MySQL не такая медленная. Что можно попробовать оптимизировать для достижения 100 записей в секунду?