Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381

Удаление большого количества данных не работает

04.09.2017, 18:45. Показов 1271. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал скрипт на удаление данных, 1 миллион строк должно удалить (в таблице 1,5 миллиона записей)
При первом запуске таблица набирает дополнительные 800 тысяч строк, при вторичном - удаляет все что хотел.
Но нужно что бы нормально работал с первого раза.

Почему так происходит?
И как исправит ситуацию?

Уже и запросы на удаление разбил
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//составляем запрос на выборку всех повтряюшихся данных
$ides_to_delete = $db->query("SELECT id FROM `book_copy` WHERE id NOT IN (SELECT MAX(id) FROM `book_copy` GROUP BY name, phone, user_id)");
 
$buf = "";//строка для запроса, содержащая все id для удаления
$i = 0;$k = 0;
 
foreach ($ides_to_delete as $item) {
    $i++;
    $buf .= "'".$item['id']."', ";//создаем правельный формат строки для запроса
    if($i == 100){$i=0;
        $db->query("DELETE FROM `book_copy` WHERE id IN (".substr($buf, 0, -2).")");
        $buf = null;
        $buf = "";
        $k++;
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2017, 18:45
Ответы с готовыми решениями:

Удаление большого количества строк
Помогите начинающей, подскажите, пожалуйста, как избежать ошибки при удалении тысяч строк? Выдается 'Timeout Expired'. Сотни строк...

Отображение большого количества данных
Здравствуйте. Подскажите как реализовать показ данных из json? Нужно вывести разные данные, картинка, большой текст и короткую информацию....

Вставка большого количества данных
Добрый день. Не подскажете, кто какими способами заносит данные в базу MS SQL Server? У меня есть 80 000 строк лога, я их...

9
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
04.09.2017, 19:40
Цитата Сообщение от powowstal Посмотреть сообщение
При первом запуске таблица набирает дополнительные 800 тысяч строк
Ошибок не возникает? Может памяти не хватает или времени?

К слову, ваш пример можно упростить, чтобы не мучаться с $i и $k:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$arr = [
    ['id' => 15],
    ['id' => 25],
    ['id' => 35],
    ['id' => 45],
    ['id' => 55]
];
 
// 2 заменить на 100
foreach(array_chunk($arr, 2) as $items){
    
    $ids = implode(',', array_column($items, 'id')); // Если id только числа, можно обойтись без кавычек
    echo $ids . '<br>';
}
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
04.09.2017, 21:21  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Ошибок не возникает?
нет, но ответ от запроса перестает приходить на примерно когда он прошел 800к записей из 150к.

Цитата Сообщение от Jodah Посмотреть сообщение
Может памяти не хватает или времени?
по времени нужно 1 минута на выполнение. Склоняюсь что памяти мало, только для кого sql or php. В каком месте можно увеличить память?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
04.09.2017, 21:46
Лучший ответ Сообщение было отмечено powowstal как решение

Решение

powowstal, до выполнения вашего цикла:
PHP
1
ini_set('memory_limit', '300M');
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.09.2017, 22:11
powowstal, почему бы не удалять 1 запросом
SQL
1
DELETE FROM `table` WHERE id IN SELECT ...
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
04.09.2017, 22:17  [ТС]
Jewbacabra, выборка и удаление с одной таблицы в mysql не работает.
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.09.2017, 22:25
Лучший ответ Сообщение было отмечено powowstal как решение

Решение

Цитата Сообщение от powowstal Посмотреть сообщение
выборка и удаление с одной таблицы в mysql не работает.
Действительно. Можно попробовать хак
SQL
1
DELETE FROM `table` WHERE id IN (SELECT * FROM (SELECT id FROM `table` ...))
1
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
04.09.2017, 23:12  [ТС]
Jewbacabra, Every derived table must have its own alias не хочет(. Тестил в phpmyadmin
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.09.2017, 23:56
Цитата Сообщение от powowstal Посмотреть сообщение
Every derived table must have its own alias
Значит добавить алиас надо
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
05.09.2017, 13:44  [ТС]
Добавлено через 5 минут
Цитата Сообщение от Jodah Посмотреть сообщение
ini_set('memory_limit', '300M');
помогло, хотя вчера не работало))) видимо вчера были магнитные бури в php.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
DELETE FROM `table` WHERE id IN (SELECT * FROM (SELECT id FROM `table` ...) AS some_alias )
так же работает.



Цитата Сообщение от Jodah Посмотреть сообщение
$arr = [
* * ['id' => 15],
* * ['id' => 25],
* * ['id' => 35],
* * ['id' => 45],
* * ['id' => 55]
];
// 2 заменить на 100
foreach(array_chunk($arr, 2) as $items){
$ids = implode(',', array_column($items, 'id')); // Если id только числа, можно обойтись без кавычек
* * echo $ids . '<br>';
}
Не совсем понял как оно работает, точнее в коде оно не работает если закопипастить и вместо $arr подставить $ides_to_delete



Добавлено через 12 минут
И разбить запрос на запросы с меньшим количеством данных на вход -
PHP
1
2
if($i == 100){$i=0;
        $db->query("DELETE FROM `book_copy` WHERE id IN (".substr($buf, 0, -2).")");
плохая идея, видимо они накапливаются а не уходят по очереди и забивают еще больше памяти + выполняется только первый. Потому я в конце цикла шлю один запрос на удаление.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2017, 13:44
Помогаю со студенческими работами здесь

Считывание большого количества данных
Есть такой код: int main() { int n; FILE *fin fin = fopen(&quot;b.in&quot;, &quot;r&quot;); fscanf(fin, &quot;%d %d %d %d %d %d %d %d %d %d %d %d %d %d...

Возврат большого количества данных функцией
Доброго времени суток. Вопрос такой: есть функция, которая генерирует 120 значений типа ключ1 = значение1 ключ2 = значение2 ...

Отрисовка большого количества данных в listView
При отрисовке элементов ListView из-за большого количества данных сильно тормозит выполнение программы. Читал про виртуализацию, сказано,...

Хранение большого количества однотипных данных
Добрый день. Подскажите, каким образом хранить данные для программы? Например, у меня имеется 1000 - 300 000 строковых данных, которые...

Трудности с выводом большого количества данных
Доброго времени суток ! Столкнулся с такой проблемой. Имеется база данных в access. В ней уже сделано много таблицы и забито много...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru