Wydajne usuwanie rekordów dla sytuacji typu IF NOT EXIST

0

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?

1
  1. czy ten status to aby dobre rozwiązanie - jeśli w tabeli xyjoins masz poprane indeksy to sprawdzenie czy dany rekord jest do czegoś podpięty SQLem będzie niezauważalne
  2. jak 1 jest nie do ruszenia to najpierw dwa updatey powiązanych tabel a potem delete na xyjoins
0

Gdybym robił to dla siebie zrobiłbym tak jak to zasugerowałeś. W końcu po to stworzono relacyjny system baz danych, by z relacji korzystać.

Niestety jest nie do ruszenia, bo mam na tapecie klienta, który "wie lepiej". Szkoda strzępić języka...

1 użytkowników online, w tym zalogowanych: 0, gości: 1