robos85
17.02.2010, 16:14:39
Chcę sprawdzić, czy w danym dniu padła odpowiedź konkretnego użytkownika. Napisałem sobie 2 zapytania i zastanawiam się, które będzie bardziej optymalne?
SELECT COUNT(`id`)
FROM `exp_questions_answers`
WHERE (
user_id = '1'
)
AND (
DATE( `date` ) = '2010-02-17'
)
czy
SELECT `id`
FROM `exp_questions_answers`
WHERE (
user_id = '1'
)
AND (
DATE( `date` ) = '2010-02-17'
)
LIMIT 1
Ta tabela będzie z czasem spora np kilka mln rekordów.
erix
17.02.2010, 17:36:41
Zależy od silnika bazodanowego oraz indeksów.
Podejrzewam, że COUNT będzie nieco szybszy, ale przeprowadź najpierw jakiś benchmark.
Gapollo
18.02.2010, 22:03:24
Niezależnie od silnika bazodanowego, czy indeksów (zakładam, że w obu wypadkach będzie ten sam silnik i będą lub nie założone indeksy na id, user_id, date) drugie zapytanie (z limit 1) będzie szybsze lub równe.
W przypadku, kiedy istnieje taki rekord wystarczy jego jedno wystąpienie, by baza danych zwróciła wynik, do drugiego (z count) musi zliczyć wszystkie.
W przypadku, kiedy nie istnieje odpowiedni rekord oba zapytania wykonają identyczne sprawdzenie.
PS1. Koszt agregatu pomijam, jako mało tutaj istotny, ale i tak działa na niekorzyść zapytania pierwszego.
wiiir
24.02.2010, 09:55:17
nie wiem jak w innych bazach ale aktualnie jestem na bierzaco w oraclu
taki count
SELECT COUNT(1)
FROM `exp_questions_answers`
WHERE (
user_id = '1'
)
AND (
DATE( `date` ) = '2010-02-17'
)
jest chyba najlepszy od count(*) count('id')