Какой самый быстрый способ проверить, существует ли URL в таблице MySQL? - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть столбец varchar(255), где я храню URL-адреса в базе данных MySQL.Этот столбец имеет уникальный индекс.

Когда мой сканер обнаруживает URL-адрес, он должен проверить базу данных, чтобы убедиться, что этот URL уже существует.Если он существует, сканер выбирает данные об этой записи.Если он не существует, сканер добавляет URL-адрес.В настоящее время я делаю это с помощью следующего кода:

$sql = "SELECT id, junk
        FROM files
        WHERE url = '$url'";
$results = $this->mysqli->query( $sql );

// the file already exists in the system
if( $results->num_rows > 0 )
{
    // store data to variables
}

// the file does not exists yet... add it
else
{

    // insert new file
    $sql = "INSERT INTO files( url )
            VALUES( '$url' )";
    $results = $this->mysqli->query( $sql );

}

Я понимаю, что есть много способов сделать это.Я читал, что с помощью MySQL оператор if / else может ускорить это.Может кто-нибудь объяснить, как MySQL будет обращаться с этим по-другому, и почему это может быть быстрее?Есть ли другие варианты, которые я должен проверить?Мои сканеры проводят много подобных проверок, и ускорение этого процесса может значительно повысить скорость моей системы.

Ответы [ 3 ]

1 голос
/ 07 декабря 2011

Во-первых, URL получатся намного длиннее, чем varchar(256).

Во-вторых, потому что они такие длинные, что вы не хотите проводить сравнения строк, он получает очень медленно по мере роста стола.Вместо этого создайте столбец со значением хеш-функции и сравните его.

Вы, конечно, должны индексировать столбец хеш-функции.

Что касается фактической вставки, альтернативой является наложение уникального ограничения нахешЗатем делайте вставки вслепую, позволяя SQL отклонять дубликаты.(Но вам придется добавить обработчик исключений в ваш код, который имеет свои издержки.)

0 голосов
/ 08 декабря 2011

Сначала я сделаю вставку и проверим успешность (disabled_rows), затем выберу.Если вы сначала проверите, а затем выполните вставку, существует вероятность, что URL был вставлен в течение этого небольшого временного окна.И вам нужно добавить больше кода, чтобы справиться с этой ситуацией.

0 голосов
/ 07 декабря 2011

Учитывая, что транзакции не используются, чтобы вставить новую строку, если старая строка не существует по условию WHERE, вы можете использовать:

"INSERT INTO files( url ) VALUES ( $url ) WHERE NOT EXISTS ( SELECT * FROM files WHERE url = $url );"

Я не могу думать о "однострочнойcommond "выбрать и вставить одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...