Як прискорити безліч insert в mysql

У мене php скрипт виконує цикл while, який повторюється 10 000 ра
Поки ви це виправите, база даних продовжити страждає а вашої реалізації на php.

Розповідайте яка задача і чому ви вирішили її через while з циклом аж в 10 000 ітерацій. Проблема тут, а не в базі даних.

index0h запропонував найправильніший варіант, але навіть з транзакцією, 20-200 звернень до вашого php, покладуть базу даних \ сервер (транзакції-то в RAM живуть) або повиснуть все, поки БД укладе всі записи на диск.

Якщо вам потрібно прогнати масив даних по базі і знайти всі записи, за якими в БД немає даних і щось з ним зробити, то для цього є умова SQL IN. яке дозволить перевірити відразу багато значень.

У вашому випадку вам потрібно просто віджати ті дані, яких немає в базі, потім запустити транзакцію, почати вставку в циклі, завершити транзакцію. Усе.

Як віджати? Отримати записи які відомі базі:
SELECT uid FROM `users` WHERE uid in (.)
видалити їх з $ friends2xman засобами PHP. Як скласти запит що б відразу отримати бажане, не знаю, не варить вже голова :)

Те, що залишиться в $ friends2xman. і буде тим що потрібно згодувати базі для вставки.

У In є обмеження на кількість значень, наприклад якщо в СУБД Оракл я вкажу в IN 1001 значення - запит завершиться помилкою (це обмеження регулюється, але ніхто його не змінює, не навіщо). Замість цього я реалізував роботу зі списком за індексом і ліміту (к-ть даних яке забереться функція зі списку).
тобто маючи список в 600 000 записів, треба прогнати його через IN і знайти все, кого немає в базі:
Функція починає з 0 індексу, бере по 500 записів, формує слід. індекс.
Перший цикл: Початковий індекс: 0, ліміт: 500, слід. індекс: 501
Підсумок: через кому список рядків для SQL, відповідний для IN по синтаксису, банально для "(" + sIDS + ")".
Другий цикл: Початковий: 501, ліміт: 500, слід. індекс: 1001,
і так поки не вибере все 600 тис. записів і не сформує мені список того, що потрібно лише додати в базу.

Схожі статті