В случае, когда я хочу проверить, существует ли определенная запись в базе данных, у меня есть два варианта.
Я могу создать sql-запрос с помощью COUNT (), а затем проверить, если результат> 0 ...
... или я могу просто получить записи, а затем подсчитать количество строк в возвращенном наборе строк. Например, с $ result-> num_rows;
Что лучше / быстрее? в mysql? в общем?
на самом деле я хотел знать это в целом и в частности, так как я работаю не только с mysql ... Я добавил это к вопросу.


YMMV, но я подозреваю, что если вы только проверяете наличие и не должны каким-либо образом использовать полученные данные, запрос COUNT () будет быстрее. Насколько быстрее будет зависеть от того, сколько данных.
Самый быстрый, вероятно, запрос базы данных, если что-то существует:
SELECT EXISTS ([your query here])
Это может быть НАМНОГО быстрее, потому что вам все равно, СКОЛЬКО, что экономит время SQL.
И это дает оптимизатору (сервера базы данных) шанс сделать свое дело: нет необходимости считать вещи, если вам просто нужно знать, что они есть.
Вы оба ошибаетесь, этот метод может быть быстрее для небольших таблиц, но как только вы пройдете определенный объем данных SELECT COUNT () быстрее. Если вам нужно выбирать вслепую, выберите COUNT (), потому что он быстро работает даже с большими таблицами и одинаково быстро с небольшими таблицами.
и в моем случае (mysql) у меня нет выбора, так как EXISTS можно использовать только в подзапросах, кажется
Мне кажется, что она СУЩЕСТВУЕТ ;-). Предложение EXIST, конечно, работает с подзапросом. См. informit.com/articles/article.aspx?p=377653&seqNum=8
Я бы определенно сделал это в PHP, чтобы уменьшить нагрузку на базу данных.
Чтобы получить счетчик и, чтобы получить возвращенные строки в SQL, вам нужно будет выполнить два запроса ... COUNT, а затем SELECT
Метод PHP дает вам все необходимое в одном объекте результата.
Не думаю, что это снизит нагрузку на базу данных. База данных должна фактически получать данные, и они должны быть переданы и преобразованы в PHP. Напротив, при выполнении SELECT EXISTS база данных может просто обращаться к своему индексу.
SELECT COUNT(*) FROM table
- лучший выбор, эта операция выполняется очень быстро как на маленьких, так и на больших таблицах. Хотя возможно, что
SELECT id FROM table
быстрее на маленьких столах, разница в скорости будет микроскопической. Но если у вас большая таблица, эта операция может быть очень медленной.
Поэтому лучше всегда выбирать COUNT(*) the table (и это быстрее сделать *, чем выбрать конкретный column), так как в целом это будет самая быстрая операция.
Теперь мы говорим о реализациях базы данных. COUNT () не всегда будет быстро. В Postgresql, например, COUNT () на очень большой таблице может быть довольно медленным. EXISTS, с другой стороны, был создан для этой цели.
просто, насколько я вижу в mysql, НЕ СУЩЕСТВУЕТ
Я бы попробовал. (Я не могу сам)
Если все, что вы делаете, это проверка на существование, то
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 (*) обычно менее эффективен, если:
Если вы COUNT на основе предложения WHERE, которое гарантированно создает одну запись (или 0) и, СУБД знает это (на основе индексов UNIQUE), тогда это должно быть столь же эффективным. Но вряд ли такое состояние будет у вас всегда. Кроме того, СУБД не всегда может уловить это в зависимости от версии и СУБД.
Подсчет в приложении (когда вам не нужна строка) почти всегда гарантированно будет медленнее / хуже, потому что:
Конечно, если вы хотите что-то сделать со строкой, если она существует, то определенно быстрее / лучше всего просто попытаться получить строку для начала!
это звучит как лучший вариант, если я хочу получить данные в случае их существования! благодарю вас!
не могли бы вы добавить небольшой абзац о разнице между простой проверкой, с одной стороны, и проверкой плюса, если существует извлечение, с другой стороны. то я бы пометил ваш ответ как принятый.
Если вам нужна чистая скорость, сделайте тест! В дополнение к методам, предложенным другими:
SELECT 1 FROM table_name WHERE ... LIMIT 1
может быть быстрее из-за исключения подзапроса. Сравните это.
Это может быть полезно, если вы пометите свой вопрос с помощью mysql. Не знал, что это специфично для mysql, прежде чем читать в комментариях.