Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Które zapytanie bardziej optymalne?
robos85
post
Post #1





Grupa: Zarejestrowani
Postów: 466
Pomógł: 11
Dołączył: 21.09.2006
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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?
  1. SELECT COUNT(`id`)
  2. FROM `exp_questions_answers`
  3. WHERE (
  4. user_id = '1'
  5. )
  6. AND (
  7. DATE( `date` ) = '2010-02-17'
  8. )
czy
  1. SELECT `id`
  2. FROM `exp_questions_answers`
  3. WHERE (
  4. user_id = '1'
  5. )
  6. AND (
  7. DATE( `date` ) = '2010-02-17'
  8. )
  9. LIMIT 1


Ta tabela będzie z czasem spora np kilka mln rekordów.

Ten post edytował robos85 17.02.2010, 16:15:24
Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Zależy od silnika bazodanowego oraz indeksów.

Podejrzewam, że COUNT będzie nieco szybszy, ale przeprowadź najpierw jakiś benchmark.
Go to the top of the page
+Quote Post
Gapollo
post
Post #3





Grupa: Zarejestrowani
Postów: 33
Pomógł: 5
Dołączył: 2.11.2006
Skąd: 52.259 °N, 21.020 °E

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wiiir
post
Post #4





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


nie wiem jak w innych bazach ale aktualnie jestem na bierzaco w oraclu
taki count
  1. SELECT COUNT(1)
  2. FROM `exp_questions_answers`
  3. WHERE (
  4. user_id = '1'
  5. )
  6. AND (
  7. DATE( `date` ) = '2010-02-17'
  8. )


jest chyba najlepszy od count(*) count('id')
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 09:41