Лучшая практика для пропуска повторяющихся записей в MySQL - PullRequest
2 голосов
/ 07 июня 2011

Ранее я писал агрегатор каналов, но немного пытаюсь его оптимизировать. В прошлом, используя simplepie (класс php) для разбора каналов, я использовал функцию get_id () для каждого элемента канала, чтобы вернуть хеш (md5-соединение link + title). Я храню этот «id» как «remote_id» в MySQL. Однако, чтобы убедиться, что у меня нет дубликатов, я выполняю запрос SELECT для каждого элемента фида, чтобы убедиться, что «remote_id» не существует. Это кажется неэффективным, учитывая, что я смотрю на тысячи каналов.

Насколько эффективнее просто превратить remote_id в уникальный ключ, а затем позволить базе данных не записывать новую запись при каждом проходе? Любой другой способ спроектировать это лучше?

1 Ответ

1 голос
/ 07 июня 2011

Да, если ключ должен быть уникальным в mysql, обычно рекомендуется определить его как уникальный ключ.

При вставке возможных дубликатов вы можете использовать PDO и попробовать {} catch () {}заявления, чтобы отфильтровать их, они будут выбрасывать исключения.Вам не нужно проверять заранее.

Я использую что-то подобное в аналогичной ситуации (оповещение псевдокода):

        $stmnt = $this->dbh->prepare('INSERT QUERY');  

        try {
            $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->dbh->beginTransaction();

            $stmnt->execute($celss);

            $this->dbh->commit();
        } catch (Exception $e)
        {
            $this->dbh->rollback();
            $this->invalidRows[] = array($cells,$e->getMessage());
            continue;
        }
...