Быстрая проверка наличия записи в базе данных SQL - PullRequest
2 голосов
/ 28 октября 2009

Nitpicker Вопрос:

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

Iues mysql на данный момент, но должен быть довольно простым ...

Так что я должен использовать

select id from table where a=b limit 1;

или

select count(*) as cnt from table where a=b;

или что-то совершенно другое?

Я думаю, что SELECT с ограничением должен остановиться после первого поиска, count (*) должен проверить все записи. Так что SELECT может быть быстрее.

Самым простым делом было бы сделать несколько циклов и протестировать их, но мои тесты не помогли. (Моя тестовая система, похоже, использовалась иным образом, что приводило к разным результатам)

Ответы [ 2 ]

3 голосов
/ 28 октября 2009

эта «потребность» часто указывает на ситуацию, когда вы пытаетесь ВСТАВИТЬ или ОБНОВИТЬ. две наиболее распространенные ситуации - это массовая загрузка / обновление строк или подсчет совпадений.

проверки на наличие строки сначала можно избежать с помощью оператора INSERT ... ON DUPLICATE KEY UPDATE . для счетчика посещений требуется только одно утверждение. для массовой загрузки загрузите данные во временную таблицу, затем используйте INSERT ... ON DUPLICATE KEY UPDATE , используя временную таблицу в качестве источника.

но если вы не можете использовать это, то самый быстрый способ будет select id from table where a=b limit 1; вместе с force index, чтобы mysql смотрел ТОЛЬКО на индекс.

1 голос
/ 28 октября 2009

Предел 1 скажет MySQL прекратить поиск после того, как он найдет одну строку. Если может быть несколько строк, соответствующих критериям, это быстрее, чем count (*).

Есть и другие способы оптимизировать это, но точный характер будет зависеть от количества строк и разброса a и b Я бы использовал подход «где a = b», пока вы на самом деле не столкнетесь с проблемами производительности. Базы данных часто бывают настолько быстрыми, что большинство запросов вообще не влияют на производительность.

...