2012-01-13 3 views
1

* если вы хотите поленитесь прочитать описание вы можете найти мой вопрос в конце концов ...MySQL Вставить Производительность stressTool

Привет, я построить простую базу данных:

CREATE TABLE `users` (
    `id` varchar(45) NOT NULL, 
    `full_name` varchar(45) NOT NULL, 
    `first_name` varchar(45) NOT NULL, 
    `last_nmae` varchar(45) NOT NULL, 
    `login` varchar(45) NOT NULL, 
    `password` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`,`full_name`,`login`), 
    UNIQUE KEY `idusers_UNIQUE` (`id`), 
    UNIQUE KEY `login_UNIQUE` (`login`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 

Теперь я тестирование производительности вставки одной строки.

Я создал инструмент для стресса с C# и запустил его в 1M строк. Это код, если вы заинтересованы:

abstract class Job 
    { 
     private static object synObject = new object(); 
     private static int _id = 0; 
     private static DateTime startingTime = DateTime.Now; 
     private const int JOB_PER_SIRCLE = 10; 

     protected int id; 
     public Job() 
     { 
      lock (synObject) 
      { 
       _id++; 
       id = _id; 
      } 
     } 

     public void run() 
     { 
      while (true) 
      { 
       for (int i = 0; i < JOB_PER_SIRCLE; i++) 
       { 
        doJob(); 
       } 
       lock (synObject) 
       { 
        calculate(); 
       } 
      } 
     } 

     private static DateTime lastLog = DateTime.Now; 
     private static long numOfJobsAcomplished = 0; 
     private static long totalNumOfJobsAcomplished = 0; 

     private static void calculate() 
     { 
      totalNumOfJobsAcomplished += JOB_PER_SIRCLE; 
      numOfJobsAcomplished += JOB_PER_SIRCLE; 
      DateTime now = DateTime.Now; 
      TimeSpan timePass = now - lastLog; 

      if (timePass.TotalSeconds > 1) 
      { 
       double total = 1000000; 
       TimeSpan speed = TimeSpan.FromMilliseconds(timePass.TotalMilliseconds/numOfJobsAcomplished * total); 
       Console.WriteLine("Speed = " + String.Format("{0:00.0000}", speed.TotalMinutes) + " Completed " + String.Format("{0:00.000}", totalNumOfJobsAcomplished/total * 100) + "% time pass " + (now - startingTime)); 
       lastLog = now; 
       numOfJobsAcomplished = 0; 
      } 
     } 

     protected abstract void doJob(); 
    } 

В методе doJob() Я делаю вставку и я бегу, 16 потоков 16 Иова (я обнаружил, что это лучшая производительность на моей машине)

В любом случае, мой вопрос касается результата, я получаю от 85 до 105 минут, чтобы вставить 1 000 000 строк. Является ли это быстрым или я должен искать другую базу данных для работы?

P.S * Когда я вставив я хэширования с помощью алгоритма MD5Crypt

+1

'Быстро это субъективно. Каковы ваши требования и/или ограничения?Каким будет поведение нагрузки в действительности? Какие другие операции чтения или записи будут происходить на столе? Также важно формат SQL-запроса. Используете ли вы параметризованные запросы для минимизации сетевого трафика, времени разбора и компиляции и т. Д.? – MatBailie

+0

@Dems Я просто использую «вставить в значения пользователей» («...»); –

+0

Посмотрите на параметризованные запросы. Когда вы повторяете один и тот же запрос снова и снова, они часто выполняют быстрее. – MatBailie

ответ

1

Я всегда нахожу это забавным, когда кто-то пытается «вину» скорость записи на программное обеспечение, без учета других факторов, принимая во внимание. Итак, начнем.

У MySQL есть 2 двигателя, которые широко используются. MyISAM и InnoDB. InnoDB - это механизм транзакций, который использует кластерный первичный ключ для записи записей на hdd. Это означает, что он выполняет все виды вычислений, чтобы безопасно записывать данные на диск и иметь последовательные записи, написанные рядом друг с другом. Это означает, что поиск первичных ключей выполняется быстро, но для записи требуется некоторое время.

Чтобы перевести это на простой английский, это означает, что ваш компьютер будет работать немного сложнее, чтобы физически записать данные на диск безопасно и таким образом, чтобы он мог быстро найти записи.

Это также означает, что узким местом во всем этом испытании является ваш жесткий диск. 85 минут для вставки 1 мл. записей составляет примерно 200 вложений в секунду. Это довольно приятная фигура для обычного механического привода на 7200 об/мин (мой диск может достигать 350 дюймов IOPS). Таким образом, из 350 IOPS (давайте возьмем мой диск) вы достигли 200, что является отличной фигурой, когда ваш жесткий диск используется для чтения и записи, и у вас, вероятно, есть несколько служб, которые запускаются вашей ОС, для которых требуется ввод/вывод жесткого диска.

TL; DR - если вы используете другое программное обеспечение, запись может быть немного быстрее в начале. Перед заменой программного обеспечения вам необходимо учитывать все факторы.

+0

Я не говорил, что я обвиняю MySQL. Я просто пытаюсь понять, что это хорошая скорость или нет. При запуске моего сервера будет запущено множество вещей. Я просто хочу создать хорошую плоскость производительности. –

+0

Я пытаюсь показать, что скорость вставки зависит от аппаратного обеспечения LOT, особенно от подсистемы жесткого диска. В принципе, да, для механического 7200 об/мин hdd это нормальная скорость. –

0

Если вы хотите оптимизировать производительность вставки, я могу предложить вам изменить первичный ключ на синтетический auto increment bigint. Причина в том, что Innodb использует кластерный индекс первичного ключа, который хранит ключи по диапазону. Если вы используете несекретный первичный ключ, вам нужно будет прочитать блок памяти и записать его для каждой строки в худшем случае, а не использовать кеш, как вы будете с последовательным ключом. Когда вы вставляете последовательные ключи, производительность увеличивается на порядки, попробуйте.

CREATE TABLE `users` (
    `id` bigint(20) auto increment not null PRIMARY KEY, 
    `user_id` varchar(45) NOT NULL, 
    `full_name` varchar(45) NOT NULL, 
    `first_name` varchar(45) NOT NULL, 
    `last_nmae` varchar(45) NOT NULL, 
    `login` varchar(45) NOT NULL, 
    `password` varchar(45) NOT NULL, 
    UNIQUE KEY (`user_id`,`full_name`,`login`), 
    UNIQUE KEY `idusers_UNIQUE` (`user_id`), 
    UNIQUE KEY `login_UNIQUE` (`login`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 

Кстати, я не уверен, что идентификатор (user_id) было до того, так что я оставил, но вы могли бы принять его, если вам где использовать его в качестве синтетического первичного ключа.

+0

Хорошо, я запускаю тест, похоже, что он не влияет на производительность. –

+0

Сколько строк вы пробовали? Также вы хотите убедиться, что ваш innodb_buffer_size установлен правильно, что установлено сейчас? –

+0

Что такое innodb_buffer_size? –

Смежные вопросы