Удалить запрос оптимизации - PullRequest
0 голосов
/ 09 мая 2019

У меня есть запрос на удаление, который хорошо работает с небольшим количеством строк. Но теперь с строкой около 80 Кбайт происходит сбой из-за «тайм-аута»

Мои две таблицы такие:

TableA
------

| Column     | type       |
|------------|------------|
| link_id    | bigint(40) |
| product_id | int(10)    |
| parent_id  | int(10)    |

Table B
-------

| Column    | type    |
|-----------|---------|
| id        | int(11) |
| parent_id | int(11) |
| child_id  | int(11) |

Я делаю такой запрос, чтобы удалить

DELETE FROM TABLEA
WHERE link_id IN (
    SELECT link_id FROM (
        SELECT link_id, parent_id, product_id FROM TABLEA
        UNION ALL
        SELECT id, parent_id, child_id FROM TABLEB
    ) tbl
    GROUP BY parent_id, product_id
    HAVING count(*) = 1
    ORDER BY parent_id
) ; 

Но не самый оптимизированный.

Цель состоит в том, чтобы удалить из таблицы A все записи, отсутствующие в таблице B для пары "parent_id / child_id".

в таблице A столбец "product_id" является "child_id".

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Я бы использовал NOT EXISTS, чтобы получить link_id, который не имеет никакого отношения к tableb

DELETE FROM TABLEA
WHERE link_id IN (SELECT link_id 
                  FROM TABLEA a
                  where not exists (select link_id 
                                    from tableb b
                                    where b.parent_id=a.parent_id and b.child_id=a.product_id))
0 голосов
/ 09 мая 2019

Один из способов решения этой проблемы

DELETE A  FROM TABLEA A
INNER JOIN 
(    SELECT link_id FROM 
    (
        SELECT link_id, parent_id, product_id FROM TABLEA
        UNION ALL
        SELECT id, parent_id, child_id FROM TABLEB
    ) tbl
    GROUP BY parent_id, product_id
    HAVING count(*) = 1)B
ON A.link_id=B.link_id
where   A.link_id is not null; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...