@codecity

[.Net] Скорость создания записи в MySQL по сравнению с MS SQL (результаты теста + вопрос)

Столкнулся с такой необходимостью: обеспечить создание 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 записей в секунду?
  • Вопрос задан
  • 3632 просмотра
Пригласить эксперта
Ответы на вопрос 4
XuMiX
@XuMiX
Ну, для начала, делать testContext.SaveChanges(); после цикла.
Можно поисследовать, какие результаты будут, если обернуть все в транзакцию.
Также, немаловажно, какой движок БД используется в Мускуле. Если InnoDB, то надо в настройки зайти и поувеличивать объем памяти и т.п., доступный ему. Типа такого: www.google.ru/search?q=mysql+innodb+optimization
ЗЫ самое главное, нафига вам мускуль на.нет, если есть постгре и mssql?
Ответ написан
@rPman
Это какой то тихий ужас… когда то писал на .net базы, с mysql работа на запись была на уровне 200 запросов в секунду, и не просто табличку а с индексами и т.п. при этом комп древний и слабый был.

Уверены что не нужно ничего дополнительно тюнить при использовании ключевого слова base(...)?
Ответ написан
pietrovich
@pietrovich
А без использования EF не пробовали? Какая производительность на той-же машине при использовании кондового ADO.NET?
Ответ написан
@codecity Автор вопроса
Поигрался еще.

Во-первых, проверил на Java. В качестве ORM использовал EclipseLink. Результат идентичный.

Во-вторых, с помощью MySQLInstanceConfig.exe удалил существующую инстанцию и создал заново, но уже с максимальными параметрами (только база с поддержкой транзакций, т.к. они нужны).

В результате — примерно такой же результат. Причем во время проведения теста (а он длится около 40 секунд), на ноутбуке остается свободно 700 Мб. памяти и 20-30% процессора.

Еще проверил в многопоточной среде. Если в 1-н поток — можно вставить 20 записей в секунду, то запустив 100 потоков — удалось увеличить количество до 250 записей в секунду.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы