Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Медленное удаление
 
 автор: gus   (01.09.2009 в 10:58)   письмо автору
 
 

Можно както ускорить процесс удаления данных?

например цикл от 0 до 100
{
unlink($path_ori);
unlink($path_small);
$sql = "DELETE FROM `photos` WHERE filename='" . $value . '\' and status <>'.STATUS_ARCHIVE.' LIMIT 1';

mysql_query($sql)
}

выполняется 60 секунд!!!
пробовал сеначала делать SELECT id и потом DELETE where id=.....
скорость выполнения тоже медленная.

Как можно ускорить?

P.S. В таблице более 2 миллионов записаей.

  Ответить  
 
 автор: Trianon   (01.09.2009 в 11:51)   письмо автору
 
   для: gus   (01.09.2009 в 10:58)
 

Нормальные люди обращаются к строкам таблицы по первичным ключам. В крайнем случае - по индексированным полям.
И уж всяко - не в цикле.

  Ответить  
 
 автор: gus   (01.09.2009 в 12:07)   письмо автору
 
   для: Trianon   (01.09.2009 в 11:51)
 

А как мне подсунуть список значений для удаления в один запрос?

  Ответить  
 
 автор: Trianon   (01.09.2009 в 12:08)   письмо автору
 
   для: gus   (01.09.2009 в 12:07)
 

WHERE поле IN (список)

  Ответить  
 
 автор: gus   (01.09.2009 в 14:09)   письмо автору
 
   для: Trianon   (01.09.2009 в 12:08)
 

А есть в длинне SQL запроса ограничения?
например можно в WHERE IN указать 10.000 значений?

  Ответить  
 
 автор: Valick   (01.09.2009 в 14:14)   письмо автору
 
   для: gus   (01.09.2009 в 14:09)
 

может у вас с логикой кода что-то не то?
Опишите что вы хотите сделать, в смысле подробнее про удаление файлов что, зачем и почему удаляете.

  Ответить  
 
 автор: gus   (01.09.2009 в 15:25)   письмо автору
 
   для: Valick   (01.09.2009 в 14:14)
 

В POST запросе приходят имена файлов которые нужно удалить.
Обычно таких фалов за раз более 100....

Получается в цикле я пробегаюсь по массиву и поочерёдно удаляю файл... удаляю запись в базе данных об этом файле. и так сто раз... Эта процедура занимает 60 секунд... выходит удаление 1000 файлов заёмёт 600 секунд... а это очень долго. вот думал кто что подскажет.

  Ответить  
 
 автор: Valick   (01.09.2009 в 15:33)   письмо автору
 
   для: gus   (01.09.2009 в 15:25)
 

и что кто-то сидит и ставит галочки напротив имён 100 файлов руками?

  Ответить  
 
 автор: Trianon   (01.09.2009 в 15:37)   письмо автору
 
   для: Valick   (01.09.2009 в 15:33)
 

если б ставил галочки - всё было бы проще. Первичный ключ и вся недолга.
А тут кто-то похоже руками имена файлов в форму вписывает.

  Ответить  
 
 автор: Trianon   (01.09.2009 в 15:38)   письмо автору
 
   для: gus   (01.09.2009 в 15:25)
 

ну положим 100 и даже 200 это еще не 10000.
Да и 10000 можно в один запрос включить. Если это первичные (или хотя бы уникальные) ключи - запросто.

  Ответить  
 
 автор: gus   (01.09.2009 в 15:55)   письмо автору
 
   для: Trianon   (01.09.2009 в 15:38)
 

Да ключи первичные. Но индексы могут идти не подряд.
можете привести пример такво запроса ?

  Ответить  
 
 автор: Valick   (01.09.2009 в 16:00)   письмо автору
 
   для: gus   (01.09.2009 в 15:55)
 

По какому критерию происходит выборка удаляемых файлов
(вы уж меня простите, но жутко интересно)

  Ответить  
 
 автор: gus   (01.09.2009 в 16:19)   письмо автору
 
   для: Valick   (01.09.2009 в 16:00)
 

Временной диапазон.
например все начиная с 2009-09-01 04:03:15 и заканчивая 2009-09-01 04:24:01
Но в скрипт передается список имен файлов этих фотографий за это время.

  Ответить  
 
 автор: Valick   (01.09.2009 в 16:27)   письмо автору
 
   для: gus   (01.09.2009 в 16:19)
 

ничё не понимаю... в чём фишка? почему сразу в запросе на удаление не указать этот временной диапазон?

  Ответить  
 
 автор: Valick   (01.09.2009 в 16:31)   письмо автору
 
   для: gus   (01.09.2009 в 15:55)
 

типа так
<?php
// Принимаем данные POST (надеюсь массив передаёте)
if(isset($_POST[id]) && is_array($_POST[id])) $id=$_POST[id]; else exit;
// Обрабатываем массив данных (это как уж захотите так и обработаете)
foreach($id as $key=>$value){
$value=trim($value);
if(
is_numeric($value) && strlen($value)<20$new[]=$value;
}
// Формируем строку из массива для использования в запросе
$srting=implode(",",$new);
// Формируем запрос
$query="DELETE FROM `photos` WHERE id IN($srting)";
$res=mysql_query($query);
?>

но судя по последним постам, что-то там у вас тут не так, и вам этот код не понадобится скорее всего
___
блин ступил с кодом щас поправлю)

  Ответить  
 
 автор: gus   (03.09.2009 в 16:38)   письмо автору
 
   для: Valick   (01.09.2009 в 16:31)
 

И в этомже цикле foreach удалять файлы? или может быстрее было бы удалить файлы средством самой SQL?

как лучше?

  Ответить  
 
 автор: Trianon   (03.09.2009 в 23:13)   письмо автору
 
   для: gus   (03.09.2009 в 16:38)
 

А прочесть текст скрипта?

  Ответить  
 
 автор: Trianon   (03.09.2009 в 23:13)   письмо автору
 
   для: Valick   (01.09.2009 в 16:31)
 

меж тем отступы можно было и расставить :-/

  Ответить  
 
 автор: Trianon   (01.09.2009 в 16:46)   письмо автору
 
   для: gus   (01.09.2009 в 15:55)
 

> Но индексы могут идти не подряд.
Вот уж совсем не требуется.

>можете привести пример такво запроса ?
так я ж написал.
DELETE FROM tbl WHERE id IN (1, 20, 5);

  Ответить  
 
 автор: Trianon   (01.09.2009 в 14:20)   письмо автору
 
   для: gus   (01.09.2009 в 14:09)
 

откуда Вы возьмете 10 000 ключей, кроме как не из базы?

Ограничения есть на размер текста запроса в целом.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования