SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.07.2009 14:03:46

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Скорость insert'ов в БД в зависимости от количества values в одном sql-запросе.

Доброго времени суток!

Оценивал скорость вставки данных в базу в зависимости от количества блоков в одном insert'e, получил следующие результаты (mysql 5.0, тип таблицы myIsam, без индексов), т. е. когда количество values в одном insert'е равно, допустим, 5, то запрос выглядит так:

insert into t() values(),(),(),(),()

Ряд экспериментов показал следующие результаты:

Кол-во запросов    Кол-во values в од-ном insert-e      Время выполнения Запроса (в се-кундах)    Скорость записи в базу (записей/сек)
300000                    1                                                157                                                            1910,828025
150000                    2                                                84                                                                    3571,428571
75000                    4                                                 51                                                                    5882,352941
37500                    8                                                30                                                                    10000
18750                    16                                                22                                                                    13636,36364
9375                            32                                                22                                                                    13636,36364
4688                            64                                                16                                                                    18752
2344                            128                                                13                                                                    23079,38462
1172                            256                                                11                                                             27275,63636
586                            512                                                11                                                                    27275,63636
293                            1024                                                11                                                                    27275,63636
146                            2048                                                15                                                                    19933,86667
73                            4096                                                22                                                                    13591,27273
37                            8192                                                35                                                                    8660,114286
18                            16384                                        120                                                            2457,6

То есть максимальная скорость достигается при записи (при данной конфигурации сервера) 256-1024 записей в секунду.

Вопрос, собственно - а почему так? Чем это определяется эта зависимость, из-за чего оно так? Подскажите кто знает, плиз, хоть куда копать.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 03.07.2009 02:48:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Скорость insert'ов в БД в зависимости от количества values в одном sql-запросе.

Подозрительные у Вас чиселки... слишком похожи дробные значения smile

Запросы с большим количеством записей проходят быстрее, потому что помимо собственно вставки
делаются операции вида «залочить табличку», «отсортировать индекс», «записать на диск» и т.п.
Когда таких действий меньше — работает быстрее.

Что касается снижения в конце — подозреваю, что Вы упираетесь в буфер сортировки (для
сортировки большого объема данных нужно много памяти): как только полный объем куска Ваших
данных перестал помещаться в памяти, MySQL стал сбрасывать часть промежуточных данных на диск.
Как следствие — резкое уменьшение скорости обработки (попробуйте поднять sort_buffer_size и
key_buffer_size и расскажите, что получилось wink)

Неактивен

 

#3 24.03.2010 16:18:01

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Скорость insert'ов в БД в зависимости от количества values в одном sql-запросе.

Как говорится, не прошло и полгода sad, вернее прошло.
Прошу прошения, что исчез с темы, не ответив на вопрос.

> Подозрительные у Вас чиселки... слишком похожи дробные значения
Согласен, но числа ручками не подводил - все "честно".

Спасибо за ответ, стало яснее.
Только вот увеличение sort_buffer_size и key_buffer_size не помогло - на трех серверах пробовал с различной конфигурацией железа и ОС.

Пример:

Изначальные значения после установки mysql-сервера:

mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name   | Value   |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+
1 row in set (0.00 sec)

mysql> show variables like 'sort_buffer_size';
+------------------+---------+
| Variable_name    | Value   |
+------------------+---------+
| sort_buffer_size | 2097144 |
+------------------+---------+
1 row in set (0.00 sec)


Эксперимент:

Kolichestvo zaprosov    Kolichestvo blockov     Vremya vipolneniya(sek) Srednyaa skorost(zapisey/sek)
32768                   1                       0.524                   62534.35
16384                   2                       0.475                   68985.26
8192                    4                       0.493                   66466.53
4096                    8                       0.489                   67010.22
2048                    16                      0.481                   68124.74
1024                    32                      0.446                   73470.85
512                     64                      0.396                   82747.47
256                     128                     0.393                   83379.13
128                     256                     0.400                   81920.00
64                      512                     0.468                   70017.09
32                      1024                    0.631                   51930.27
16                      2048                    0.921                   35578.72
8                       4096                    0.880                   37236.36
4                       8192                    1.207                   27148.30
2                       16384                   1.290                   25401.55
1                       32768                   2.086                   15708.53

Увеличиваем в 10 раз и тот и другой буфер сайз.

mysql> show variables like 'key_buffer_size';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| key_buffer_size | 83886080 |
+-----------------+----------+
1 row in set (0.00 sec)

mysql> show variables like 'sort_buffer_size';
+------------------+----------+
| Variable_name    | Value    |
+------------------+----------+
| sort_buffer_size | 20971512 |
+------------------+----------+
1 row in set (0.00 sec)

Kolichestvo zaprosov    Kolichestvo blockov     Vremya vipolneniya(sek) Srednyaa skorost(zapisey/sek)
32768                   1                       0.506                   64758.89
16384                   2                       0.465                   70468.82
8192                    4                       0.476                   68840.34
4096                    8                       0.483                   67842.65
2048                    16                      0.481                   68124.74
1024                    32                      0.450                   72817.78
512                     64                      0.416                   78769.23
256                     128                     0.409                   80117.36
128                     256                     0.437                   74983.98
64                      512                     0.783                   41849.30
32                      1024                    0.756                   43343.92
16                      2048                    1.108                   29574.01
8                       4096                    0.797                   41114.18
4                       8192                    0.929                   35272.34
2                       16384                   1.727                   18973.94
1                       32768                   3.010                   10886.38

Увеличиваем в 5 раз и тот и другой буфер сайз.

mysql> show variables like 'key_buffer_size';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| key_buffer_size | 419430400 |
+-----------------+-----------+
1 row in set (0.00 sec)

mysql> show variables like 'sort_buffer_size';
+------------------+-----------+
| Variable_name    | Value     |
+------------------+-----------+
| sort_buffer_size | 104857592 |
+------------------+-----------+
1 row in set (0.00 sec)

Kolichestvo zaprosov    Kolichestvo blockov     Vremya vipolneniya(sek) Srednyaa skorost(zapisey/sek)
32768                   1                       0.518                   63258.69
16384                   2                       0.547                   59904.94
8192                    4                       0.501                   65405.19
4096                    8                       0.493                   66466.53
2048                    16                      0.487                   67285.42
1024                    32                      0.452                   72495.58
512                     64                      0.410                   79921.95
256                     128                     0.395                   82956.96
128                     256                     0.404                   81108.91
64                      512                     0.487                   67285.42
32                      1024                    0.635                   51603.15
16                      2048                    0.871                   37621.13
8                       4096                    0.821                   39912.30
4                       8192                    1.105                   29654.30
2                       16384                   1.295                   25303.47
1                       32768                   2.296                   14271.78

Собственно, максимальная скорость как была так и осталась с легким люфтом.

> (попробуйте поднять sort_buffer_size и key_buffer_size и расскажите, что получилось )
Вот... Оно и получилось :-)))


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 18.04.2010 18:01:09

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Скорость insert'ов в БД в зависимости от количества values в одном sql-запросе.

А есть ли еще какие-либо параметры, которые в теории могли бы увеличить скорость записи кроме sort_buffer_size и key_buffer_size? Или остается только более мощный сервер (при том, что на сервере, на котором проводились последние эксперименты помимо mysql толком ничего и нету)?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 18.04.2010 18:05:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Скорость insert'ов в БД в зависимости от количества values в одном sql-запросе.

Попробуйте LOAD DATA LOCAL INFILE, может быть будет быстрее.

Неактивен

 

#6 18.04.2010 18:25:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Скорость insert'ов в БД в зависимости от количества values в одном sql-запросе.

Спасибо, попробую. А если не из файла, а из памяти писать (логика моего приложения такого, что для того, чтобы сделать LOAD DATA LOCAL INFILE нужно сперва данные из памяти программы сбросить в файл, у после уже пробовать LOAD DATA LOCAL INFILE)?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 18.04.2010 18:33:59

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Скорость insert'ов в БД в зависимости от количества values в одном sql-запросе.

Сбросить в файл обычно недолго. Можно файл сделать на рамдиске, если хочется ускорить

Неактивен

 

#8 18.04.2010 18:36:37

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Скорость insert'ов в БД в зависимости от количества values в одном sql-запросе.

Да, учитывая разницу в скорости между простым insert и load data...
Спасибо!


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson