dzheka3d
@dzheka3d

Много запросов при удалении, нормально ли это?

Всем привет!
Есть класс удаления данных из БД. суть такая (удаляем комментарий):
Оговорюсь: удаление происходит как правило по id или комбинации id, mode_id - индексы присутствуют и все происходит быстро. Но в итоге получается около нескольких сотен запросов нормально ли это?

public function delComments($id){		
	// удаляем лайки к комментариям
	$this->db->squery("DELETE FROM `likes_comm` WHERE `comm_id` = {$id}");
	// удаляем события связанные с этим комментарием
	$this->delFeedEvents('comments', $id);
		// проверяем наличие дочерних комментариев в дереве
		$res = $this->db->squery("SELECT `id` FROM `comments` WHERE `parent_id` = {$id}");
		while($row = $res->fetch_assoc()){
                        // рекурсия по каждому найденному комментарию 
			$this->delComments($row['id']);
		}
                // проверяем наличие изображений в комментарии
		$res = $this->db->squery("SELECT `id` FROM `images` WHERE `mode` = 'comments' AND `mode_id` = {$id}");
		while($row = $res->fetch_assoc()){
                       // рекурсия по каждому найденному изображению
                       // нужна для того, что в каждом изображении могут быть свои комментарии, лайки и т.д. (разве что там уже нельзя опубликовать картинку) и там выходит похожий метод как и этот с комментариями.
			$this->delImages($row['id']);
		}
		
		// удаляем сам коммент
		$this->db->squery("DELETE FROM `comments` WHERE `id` = {$id}");
	}


Вопрос. На сколько сложно для БД выполнение таких (простых на мой взгляд) запросов в таком количестве (200+)?
Есть ли какой-то способ вместо рекурсии, который также пройдется по каждой сущности и удалит данные из базы, но сохранив такое количество запросов?

Позже я изменю свой способ на удаление через триггеры... буду в каждом методе этого класса создавать триггер, удалять данные, а потом удалять триггер (мне так проще контролировать эти связи). Но сейчас я хочу найти способ оптимизации моих запросов именно через php.
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 3
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Google: on delete cascade mysql
Ответ написан
Zhandos
@Zhandos
Если InnoDb используй foreign keys с CASCADE DELETE.
А лучше конечно не удалять, а помечать данные удалёнными, вдруг данные понадобятся в будущем.
Если уж так надо по php, то сохраняйте id комментов и картинок в массивы, потом удаляйте по where id коммента или картинки in (тут проставить массив)
Ответ написан
Комментировать
@xutesayor
Проставьте внешние ключи, а с ними каскадное удаление связанных данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы