Оптимизировать, где удалить в MySQL - PullRequest
0 голосов
/ 07 июня 2018

У меня проблема с производительностью mysql: мне нужно обновить большую таблицу innodb (около 1 миллиона строк), удаляя строки тысячами.Допустим, это предметы из разных источников.Таким образом, таблица имеет первичный ключ item_id, столбец provider_id, идентифицирующий поставщика элемента, и столбец external_id (который является идентификатором этого элемента в этом поставщике, способ, которым этот конкретный поставщик идентифицирует его), который должен бытьvarchar (несколько провайдеров, несколько внутренних способов определения их элементов).

Когда я обновляюсь, я иду провайдером по провайдеру, и я делаю сопоставление / сравнение между файлом json и базой данных, чтобы узнать, какиеэлементы должны быть добавлены, обновлены или удалены.Совпадение на external_id.Когда мне нужно удалить элементы, я отправляю запрос типа DELETE FROM table_items WHERE provider_id=A AND external_id IN (...).Даже если я делаю партии из 1 тыс. Предметов, это действительно медленно.

Вот упрощенное определение таблицы

CREATE TABLE `annonce` (
    `annonce_id` INT(11) NOT NULL AUTO_INCREMENT,
    `annonce_id_externe` VARCHAR(70) NOT NULL,
    `provenance_id` INT(11) NOT NULL,
    `categorie_id` INT(11) NOT NULL,
    PRIMARY KEY (`annonce_id`),
    UNIQUE INDEX `id_externe_par_provenance_et_categorie` (`annonce_id_externe`, `provenance_id`, `categorie_id`),
    INDEX `provenance_id` (`provenance_id`),
    INDEX `annonce_id_externe` (`annonce_id_externe`),
    INDEX `categorie_id` (`categorie_id`),
    CONSTRAINT `annonce_categorie_id` FOREIGN KEY (`categorie_id`) REFERENCES `categorie` (`categorie_id`) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT `annonce_provenance_id` FOREIGN KEY (`provenance_id`) REFERENCES `provenance` (`provenance_id`) ON UPDATE CASCADE ON DELETE CASCADE,
)

Есть идеи, как сделать это быстрее?

Спасибо

...