Где мне делать подсчет строк при проверке существования: sql или php? - PullRequest
1 голос
/ 03 декабря 2008

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

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

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

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

Ответы [ 8 ]

2 голосов
/ 03 декабря 2008

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

SELECT EXISTS ([your query here])
2 голосов
/ 03 декабря 2008

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

1 голос
/ 03 декабря 2008
SELECT 1 
  FROM (SELECT 1) t 
 WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )

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

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

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

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

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

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

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

1 голос
/ 03 декабря 2008

Для меня в базе.

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

1 голос
/ 03 декабря 2008

Если все, что вы делаете, проверяет наличие, то

Select count(*) ...

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

0 голосов
/ 03 декабря 2008

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

SELECT 1 FROM table_name WHERE ... LIMIT 1

может быть быстрее из-за отказа от выбора. Оцените это.

0 голосов
/ 03 декабря 2008
SELECT COUNT(*) FROM table

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

SELECT id FROM table

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

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

0 голосов
/ 03 декабря 2008

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

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

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

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