После того как столбец uid стал [уникальным] индексом, вы сделали все ваши запросы быстрее. Оба запроса, либо SELECT, либо INSERT, должны будут проверить индекс, и будет выполнять их оба одновременно .
Добавление индекса к столбцу, используемому для поиска, является реальным ответом на ваш вопрос . Вопрос о том, использовать ли запрос выбора или перехватить исключение во время вставки, является делом вкуса.
Однако ваш второй пример довольно неверен. Вы не должны обрабатывать все исключения PDO одинаково, а только конкретное исключение, связанное с этим же случаем, как показано в моем руководстве по PDO .
Лучший способ - сохранить уникальный индекс, но добавить в запрос ключевое слово IGNORE, а затем проверить количество затронутых строк
$insertuser = $X['dbh']->prepare("INSERT IGNORE INTO user (uid) VALUES (:uid)");
$insertuser->execute(['uid'=> $mail]));
if (!$insertuser->numRows()) {
header("Location: ...");
exit();
}
добавление IGNORE подавит ошибку уникального индекса, и вы сможете проверить, существует ли такое значение, просто проверив количество затронутых строк