Лучшая практика для пропуска повторяющихся записей в MySQL

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

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


person phirschybar    schedule 07.06.2011    source источник


Ответы (1)


Да, если ключ должен быть уникальным в 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;
        }
person Arend    schedule 07.06.2011