Какой самый эффективный способ проверить наличие строки в таблице? - PullRequest
5 голосов
/ 28 января 2009

Скажем, я хочу проверить, существует ли запись в таблице MySQL. Я бы запустил запрос, проверил количество возвращаемых строк. Если это делают 0 строк, в противном случае сделайте это.

SELECT * FROM table WHERE id=5
SELECT id FROM table WHERE id=5

Есть ли разница между этими двумя запросами? Потрачены ли усилия на возвращение каждого столбца или на фильтрацию столбцов, которые нам не нужны?

SELECT COUNT(*) FROM table WHERE id=5

Это совершенно новый вопрос. Будет ли сервер захватывать все значения, а затем подсчитывать значения (сложнее, чем обычно), или он не будет беспокоиться о захвате чего-либо и будет просто увеличивать переменную каждый раз, когда находит совпадение (проще, чем обычно)?

Я думаю, что делаю много ложных предположений о том, как работает MySQL, но в этом суть вопроса! Где я не прав? Научи меня, переполнение стека!

Ответы [ 6 ]

8 голосов
/ 28 января 2009

Оптимизаторы довольно умные (как правило). Обычно они берут только то, что им нужно, поэтому я пойду с:

SELECT COUNT(1) FROM mytable WHERE id = 5
4 голосов
/ 28 января 2009

Самый явный способ будет

ВЫБРАТЬ, КОГДА ЕСТЬ

Если есть индекс (или начинающийся с) id, он будет с максимальной эффективностью искать только первую запись в индексе, которую сможет найти с этим значением. Он не будет читать запись.

Если вы выберете COUNT (*) (или COUNT что-либо еще), при тех же обстоятельствах он будет считать записи индекса, но не будет читать записи.

Если вы выберете *, он будет читать все записи.

3 голосов
/ 28 января 2009

Ограничьте свои результаты не более чем одной строкой, добавив LIMIT 1, если все, что вам нужно, это проверить наличие записи.

SELECT id FROM table WHERE id=5 LIMIT 1

Это определенно гарантирует, что не будет возвращено или обработано не более одной строки. По моему опыту, LIMIT 1 (или TOP 1 в зависимости от БД) для проверки существования строки имеет большое значение с точки зрения производительности для больших таблиц.

РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял ваш вопрос, но я все равно оставлю свой ответ здесь, если это поможет.

2 голосов
/ 28 января 2009

Я бы подумал, что это

SELECT null FROM table WHERE id = 5 LIMIT 1;

будет быстрее, чем это

SELECT 1 FROM table WHERE id = 5 LIMIT 1;

но таймер сообщает, что победителем является «ВЫБОР 1».

0 голосов
/ 28 января 2009

Разница между вашими 3 запросами зависит от того, как вы создали свой индекс. Только возврат первичного ключа, вероятно, будет быстрее, так как MySQL будет иметь ваш индекс в памяти и не должен попадать на диск. Добавление LIMIT 1 также является хорошим трюком, который значительно ускорит работу оптимизатора в ранних ветках 5.0.x и ранее.

попробуйте EXPLAIN SELECT id FROM table WHERE id=5 и проверьте столбец Дополнительно на наличие USING INDEX. Если он есть, то ваш запрос идет прямо из индекса и будет намного быстрее.

0 голосов
/ 28 января 2009

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

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

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