Где мне делать количество строк при проверке существования: sql или php?

В случае, когда я хочу проверить, существует ли определенная запись в базе данных, у меня есть два варианта.

Я могу создать sql-запрос с помощью COUNT (), а затем проверить, если результат> 0 ...

... или я могу просто получить записи, а затем подсчитать количество строк в возвращенном наборе строк. Например, с $ result-> num_rows;

Что лучше / быстрее? в mysql? в общем?

Это может быть полезно, если вы пометите свой вопрос с помощью mysql. Не знал, что это специфично для mysql, прежде чем читать в комментариях.

rebra 03.12.2008 19:05

на самом деле я хотел знать это в целом и в частности, так как я работаю не только с mysql ... Я добавил это к вопросу.

markus 03.12.2008 19:15
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
517
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

YMMV, но я подозреваю, что если вы только проверяете наличие и не должны каким-либо образом использовать полученные данные, запрос COUNT () будет быстрее. Насколько быстрее будет зависеть от того, сколько данных.

Самый быстрый, вероятно, запрос базы данных, если что-то существует:

SELECT EXISTS ([your query here])

Это может быть НАМНОГО быстрее, потому что вам все равно, СКОЛЬКО, что экономит время SQL.

n8wrl 03.12.2008 18:51

И это дает оптимизатору (сервера базы данных) шанс сделать свое дело: нет необходимости считать вещи, если вам просто нужно знать, что они есть.

rebra 03.12.2008 18:53

Вы оба ошибаетесь, этот метод может быть быстрее для небольших таблиц, но как только вы пройдете определенный объем данных SELECT COUNT () быстрее. Если вам нужно выбирать вслепую, выберите COUNT (), потому что он быстро работает даже с большими таблицами и одинаково быстро с небольшими таблицами.

TravisO 03.12.2008 18:56

и в моем случае (mysql) у меня нет выбора, так как EXISTS можно использовать только в подзапросах, кажется

markus 03.12.2008 19:04

Мне кажется, что она СУЩЕСТВУЕТ ;-). Предложение EXIST, конечно, работает с подзапросом. См. informit.com/articles/article.aspx?p=377653&seqNum=8

rebra 03.12.2008 19:11

Я бы определенно сделал это в PHP, чтобы уменьшить нагрузку на базу данных.

Чтобы получить счетчик и, чтобы получить возвращенные строки в SQL, вам нужно будет выполнить два запроса ... COUNT, а затем SELECT

Метод PHP дает вам все необходимое в одном объекте результата.

Не думаю, что это снизит нагрузку на базу данных. База данных должна фактически получать данные, и они должны быть переданы и преобразованы в PHP. Напротив, при выполнении SELECT EXISTS база данных может просто обращаться к своему индексу.

rebra 03.12.2008 18:59
SELECT COUNT(*) FROM table

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

SELECT id FROM table

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

Поэтому лучше всегда выбирать COUNT(*) the table (и это быстрее сделать *, чем выбрать конкретный column), так как в целом это будет самая быстрая операция.

Теперь мы говорим о реализациях базы данных. COUNT () не всегда будет быстро. В Postgresql, например, COUNT () на очень большой таблице может быть довольно медленным. EXISTS, с другой стороны, был создан для этой цели.

rebra 03.12.2008 19:01

просто, насколько я вижу в mysql, НЕ СУЩЕСТВУЕТ

markus 03.12.2008 19:02

Я бы попробовал. (Я не могу сам)

rebra 03.12.2008 19:09

Если все, что вы делаете, это проверка на существование, то

Select count(*) ...

Но если вы получите данные, если они существуют, просто получите данные и проверьте их в PHP, иначе у вас будет два вызова.

Для меня это в базе.

Выполнение count (1) быстрее, чем $ result-> num_rows, потому что в $ result-> num_rows вы выполняете 2 операции 1 select и count, если у select есть count, быстрее получить результат. За исключением случаев, когда вам также нужна информация из файла db.

Ответ принят как подходящий
SELECT 1 
  FROM (SELECT 1) t 
 WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )

Только что протестировал, отлично работает на MySQL v5

COUNT (*) обычно менее эффективен, если:

  1. у вас могут быть дубликаты (потому что СУБД придется исчерпывающе искать все записи / индексы для дать вам точный ответ) или
  2. иметь записи NULL (для тех же причина)

Если вы COUNT на основе предложения WHERE, которое гарантированно создает одну запись (или 0) и, СУБД знает это (на основе индексов UNIQUE), тогда это должно быть столь же эффективным. Но вряд ли такое состояние будет у вас всегда. Кроме того, СУБД не всегда может уловить это в зависимости от версии и СУБД.

Подсчет в приложении (когда вам не нужна строка) почти всегда гарантированно будет медленнее / хуже, потому что:

  1. Вы должны отправить данные клиенту, клиент должен буферизовать их и выполнить некоторую работу
  2. В кэше данных СУБД MRU / LRU можно выкидывать более важные вещи.
  3. Ваша СУБД (как правило) должна будет выполнять больше операций ввода-вывода на диск, чтобы получить данные записи, которые вы никогда не будете использовать.
  4. У вас больше сетевой активности

Конечно, если вы хотите что-то сделать со строкой, если она существует, то определенно быстрее / лучше всего просто попытаться получить строку для начала!

это звучит как лучший вариант, если я хочу получить данные в случае их существования! благодарю вас!

markus 03.12.2008 19:17

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

markus 03.12.2008 22:39

Если вам нужна чистая скорость, сделайте тест! В дополнение к методам, предложенным другими:

SELECT 1 FROM table_name WHERE ... LIMIT 1

может быть быстрее из-за исключения подзапроса. Сравните это.

Другие вопросы по теме