Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290

Долгое выполнение кода при большом количестве вставки строк

12.08.2020, 02:40. Показов 1344. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо заполнить таблицу большим количеством строк с рандомными значениями. Занимает достаточно много времени.. 100т строк - 1 час. Как можно ускорить выполнение запроса?
Например, делать insert into кратным на 100 строк.. Но, думаю дело не в запросе, а в выполнении кода. БД MySql
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$charsFIO = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
            
// Функция для генерации строк
function random_string($inputChars, $needLength) {
    $inputLength = strlen($inputChars);
    $newString = '';
    for ($i = 0; $i < $needLength; $i++) {
        $newChar = $inputChars[rand(0, $inputLength - 1)];
        $newString .= $newChar;
    }
    
    return $newString;
}
 
for ($i = 0; $i < 1000000; $i++) {
    $newGender = 'M';
    if ($i % 2 == 1) {
        $newGender = 'F';
    }
    mysql_query("INSERT INTO users (fio, birthday, gender) VALUES('".random_string($charsFIO, rand(3, 30))."', '".date("Y-m-d", rand(1000000000, 1300000000))."', '$newGender');");
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.08.2020, 02:40
Ответы с готовыми решениями:

Оптимизация кода PHP+MYSQL. При большом количестве посетителей: ошибка 500
Эти кодом я вывожу тумбы к видео на страницу из базы и их названия. &lt;?php $video = mysql_query ('SELECT id,title,page,img,duration FROM...

Нестабильная работа программы при большом количестве строк во входном потоке
Вопрос с подвохом: пользователь вставляет n строк символов в консоль, где n &gt; 1000. Задание - сделать так, чтобы программа не зависала и не...

Долгое выполнение вставки в цикле
Все привет, подскажите что не так сделал, уж слишком долго он вставляет данные в таблицу DECLARE @CountGroup int = 500 DECLARE...

5
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
12.08.2020, 11:10
Лучший ответ Сообщение было отмечено Nkey как решение

Решение

Цитата Сообщение от Nkey Посмотреть сообщение
Занимает достаточно много времени.. 100т строк - 1 час
хорошо хоть БД не легла, столько запросов посылать.

Nkey, в один запрос INSERT, можно запихать несколько строк для вставки:
SQL
1
INSERT INTO `users` (`fio`, `birthday`, `gender`) VALUES ('data', 'data', 'data'),('data2', 'data2', 'data2'),('data3', 'data3', 'data3'),.....
А сами функции срабатывают достаточно быстро. У меня 1 млн вызовов выполняются за 3.5 сек.

Добавлено через 2 минуты
то есть в цикле строим ('data', 'data', 'data') а в INSERT подставляем переменную: INSERT INTO `users` (`fio`, `birthday`, `gender`) VALUES $insert_data
1
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
13.08.2020, 17:37
да и скрипты не оптимизированы для ускорения процесса. вместо
PHP
1
2
3
4
$newGender = 'M';
    if ($i % 2 == 1) {
        $newGender = 'F';
    }
можно просто
PHP
1
rand(0, 1);
и вместо f или m записывать 1 или 0 - базе данных все равно, в каком формате там инфа хранится. а random_string можно переписать в таком виде
PHP
1
2
3
function random_string($inputChars) {    
    return substr(str_shuffle($inputChars), 0, rand(3, 30));
}
что тоже должно работать быстрее

Добавлено через 19 минут
случайную дату можно сформировать средствами sql функцией dateadd.
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
13.08.2020, 19:06
Цитата Сообщение от vinikon Посмотреть сообщение
случайную дату можно сформировать средствами sql функцией dateadd
лучше не стоит перекладывать эту задачу на БД, тем более под задачу ТС. Да и потом в dateadd всё равно нужно будет отправлять случайные числа ) В таком случае уже лучше так строить дату: rand(2000, 2019).'-'.rand(1, 12).'-'.rand(1, 28);

При максимальной оптимизации этого скрипта, можно выиграть 5 сек (4 вместо 9):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$arr = str_split('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
define('CHARS_FIO', array_combine($arr, $arr));
 
function random_string() {
    $newString = array_rand(CHARS_FIO, rand(3, 30));
    return implode('',$newString);
}
 
$insert_data = '';
$newGender = 0;
for ($i = 0; $i < 1000000; $i++) {
    $newGender = !$newGender;
    $insert_data .= "('".random_string()."','".rand(2000, 2019).'-'.rand(1, 12).'-'.rand(1, 28)."','$newGender'),";
}
$insert_data = rtrim($insert_data, ',');
А времени на оптимизацию потратишь около 600 сек. 600/5=120. Итого чтобы отбить своё время нужно запустить этот скрипт 120 раз. Наверное лучше без оптимизации ))
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
13.08.2020, 21:26
насчет dateadd может и так. если sql вместо простой вставки еще надо дату из интервала формировать, наверное, выигрыша не будет во времени. но почему если в random_string() более быстрый алгоритм использовать, то это хуже - не понял

Добавлено через 6 минут
а, имеется в виду, что выигрыш времени незначителен?
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
14.08.2020, 09:32
Цитата Сообщение от vinikon Посмотреть сообщение
но почему если в random_string() более быстрый алгоритм использовать, то это хуже - не понял
а кто говорил что более быстрый алгоритм это хуже? Наоборот, лучше. Если поделитесь более быстрым алгоритмом, то я вам буду весьма благодарен )

Цитата Сообщение от vinikon Посмотреть сообщение
а, имеется в виду, что выигрыш времени незначителен?
смотря с какой стороны посмотреть. Если со стороны решения задачи ТС, то здесь даже и не стоит задумываться об оптимизации этого алгоритма. Так как скрипт уже был оптимизирован с 3600 секунд до 9 простым выводом инсерта из цикла. А бороться дальше за какие-то 5 секунд не имеет никакого смысла. Тем более что скрипт запускается один раз для заполнения БД тестовыми данными.

А если рассматривать с точки зрения других задач, то оптимизация скрипта, ускорение его работы более чем в два раза, это конечно же очень неплохой результат. И тут, результат стоит того чтобы потратить на него время.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.08.2020, 09:32
Помогаю со студенческими работами здесь

Параллельное программирование: при большом количестве задач и малом количестве потоков программа ломается
Есть функция вычисления интеграла, все исключения обработаны, эту функцию выполняют ThreadCount вспомогательных потоков, асинхронно,...

QTableView зависает на большом количестве строк
При добавлении в таблицу большого количества данных зависает виджет QTableVIew. Когда данные загрузились я их вижу, но стоит мне скроллом...

Не ляжет ли БД при большом количестве запросов
Увидел такой коммент на одном из ресурсов Добрый день, Андрей. Я пытался на сайте реализовать поиск по дополнительным полям без...

Json не сработал при большом количестве информации
отдельно ссылки проверял, обе работают, когда пытаюс ьдекодировать в json - первая работает, а вторая нет, почему? 1 код: $urlsItem =...

Unrecognized token при большом количестве совпадений
Здравствуйте, спасибо Вам всем большое за неоднократную помощь! Хочу предупредить сразу, что я совсем новичок. С такой ошибкой уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru