Są dwie tabele w relacji jeden do wielu w obu kierunkach. Jest trzecia tabela, która przechowuje relacje między tymi dwiema tabelami (id - wiązania, id z pierwszej tabeli, id z drugiej tabeli).
W pewnych sytuacjach te wiązania są usuwane dla znacznej ilości rekordów. Po usunięciu takich wiązań w obu tabelach należy zdjąć status informujący o istnieniu powiązania.
Czy istnieje jakaś wydajna alternatywa dla NOT EXISTS?
Przykład zapytania: UPDATE x SET joined = 0 WHERE NOT EXIST(SELECT id FROM xyjoins WHERE xyjoins.x_id = x.id LIMIT 1);
To rozwiązanie jest koszmarnie niewydajne, bo przy bardzo dużej ilości rekordów w tabeli X dla każdego z nich zostaje wykonane podobne zapytanie.
Do głowy wpadło mi kilka pomysłów. Pierwszy to użycie triggerów dla DELETE na tabeli joins, ale niestety mamy do czynienia z hostingiem, który triggerów w MySQL nie udostępnia (argumentują to kwestiami bezpieczeństwa).
Drugi to wyjście z drugiej strony, czyli zanim usunięte zostaną rekordy z tabeli xyjoins aktualizować statusy powiązań. Pytanie jest jedno.
W przypadku EXIST subzapytanie jest wykonywane dla każdego rekordu z tabeli, stąd koszmarnie niska wydajność. Czy w przypadki kiedy zamiast EXIST pojawiła się taka konstrukcja:
UPDATE x SET joined = 0 WHERE id IN (SELECT ...)
czy w tym przypadku subzapytanie jest wykonywane tylko raz, czy też podobnie jak w EXIST dla każdego rekordu?
Jeśli podobnie jak w EXIST to czy istnieje w MySQL taka postać zapytań, które subzapytanie wykonają tylko raz i na podstawie wyniku przeprowadzą UPDATE?