Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Доброго времени суток!
Оценивал скорость вставки данных в базу в зависимости от количества блоков в одном 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 записей в секунду.
Вопрос, собственно - а почему так? Чем это определяется эта зависимость, из-за чего оно так? Подскажите кто знает, плиз, хоть куда копать.
Неактивен
Подозрительные у Вас чиселки... слишком похожи дробные значения
Запросы с большим количеством записей проходят быстрее, потому что помимо собственно вставки
делаются операции вида «залочить табличку», «отсортировать индекс», «записать на диск» и т.п.
Когда таких действий меньше — работает быстрее.
Что касается снижения в конце — подозреваю, что Вы упираетесь в буфер сортировки (для
сортировки большого объема данных нужно много памяти): как только полный объем куска Ваших
данных перестал помещаться в памяти, MySQL стал сбрасывать часть промежуточных данных на диск.
Как следствие — резкое уменьшение скорости обработки (попробуйте поднять sort_buffer_size и
key_buffer_size и расскажите, что получилось )
Неактивен
Как говорится, не прошло и полгода , вернее прошло.
Прошу прошения, что исчез с темы, не ответив на вопрос.
> Подозрительные у Вас чиселки... слишком похожи дробные значения
Согласен, но числа ручками не подводил - все "честно".
Спасибо за ответ, стало яснее.
Только вот увеличение 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 и расскажите, что получилось )
Вот... Оно и получилось :-)))
Неактивен
А есть ли еще какие-либо параметры, которые в теории могли бы увеличить скорость записи кроме sort_buffer_size и key_buffer_size? Или остается только более мощный сервер (при том, что на сервере, на котором проводились последние эксперименты помимо mysql толком ничего и нету)?
Неактивен
Попробуйте LOAD DATA LOCAL INFILE, может быть будет быстрее.
Неактивен
Спасибо, попробую. А если не из файла, а из памяти писать (логика моего приложения такого, что для того, чтобы сделать LOAD DATA LOCAL INFILE нужно сперва данные из памяти программы сбросить в файл, у после уже пробовать LOAD DATA LOCAL INFILE)?
Неактивен
Сбросить в файл обычно недолго. Можно файл сделать на рамдиске, если хочется ускорить
Неактивен
Да, учитывая разницу в скорости между простым insert и load data...
Спасибо!
Неактивен
Страниц: 1