Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Select (CO?), Wydajność, zwaranie wyniku
mimol
post 11.10.2012, 21:20:42
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 5
Dołączył: 10.12.2007

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


Witam,
żeby sprawdzić poprawność hasła to do bazy ląduje polecenie
Select * form user where username = $username and password = $password,
Moje pytanie co mam wstawić zamiast *
a) 1
cool.gif COUNT(*)
c) count(1)
d) *
co wpisywać żeby było jak najbardziej optymalnie?
Według moich bardzo małych testów najlepiej jest mieć * , czy to prawda? Jak wy z tym sobie radzicie?
Go to the top of the page
+Quote Post
Szymciosek
post 11.10.2012, 21:23:44
Post #2





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Co do tej gwiazdki, to w tym przypadku pobiera ona z bazy wszystkie kolumny z danego wiersza tabeli, gdzie username i password podajesz.

Co tam wpisać ?
Najlepiej to czego potrzebujesz, bo pewnie nie zawsze potrzebujesz WSZYSTKIEGO tylko np po zalogowaniu potrzebujesz ID użytkownika, to wpisz zamiast gwiazdki id.
Go to the top of the page
+Quote Post
mimol
post 11.10.2012, 21:34:07
Post #3





Grupa: Zarejestrowani
Postów: 247
Pomógł: 5
Dołączył: 10.12.2007

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


nie potrzebuje nic pobierać, potrzebuje tylko sprawdzić czy cokolwiek zwraca.
Czy mógłby ktoś podać linki do jakiegoś benchmarku czy lepiej pobierać właśnie 1, id(primary key) czy *
Go to the top of the page
+Quote Post
Crozin
post 11.10.2012, 22:03:25
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Bawisz się w mikrooptymalizację, która na 99.9% jest kompletnie pozbawiona sensu. Wszystkie opcje poza gwiazdką są odpowiednie w tym wypadku. Zresztą użycie gwiazdki również nie będzie miało wpływu na działanie/wydajność kodu.
Go to the top of the page
+Quote Post
kyku
post 11.10.2012, 22:09:35
Post #5





Grupa: Zarejestrowani
Postów: 116
Pomógł: 8
Dołączył: 21.11.2008

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


Kod
mysql> SELECT COUNT(*) FROM `c_1` where id > 99;
+----------+
| COUNT(*) |
+----------+
| 10626066 |
+----------+
1 row in set (9.05 sec)

mysql> SELECT COUNT(1) FROM `c_2` where id > 99;
+----------+
| COUNT(1) |
+----------+
| 10635593 |
+----------+
1 row in set (8.72 sec)

mysql> SELECT COUNT(id) FROM `c_3` where id > 99;
+-----------+
| COUNT(id) |
+-----------+
|  10636599 |
+-----------+
1 row in set (8.37 sec)

mysql> SELECT COUNT(id) FROM `c_4` where id > 99;
+-----------+
| COUNT(id) |
+-----------+
|  10640481 |
+-----------+
1 row in set (8.05 sec)

mysql> SELECT COUNT(*) FROM `c_5` where id > 99;
+----------+
| COUNT(*) |
+----------+
| 10628649 |
+----------+
1 row in set (10.21 sec)

Tak mi wyszło smile.gif
(bazy różnią się ilością rekordów ale i tak widać, które jest najlepsze)

// edit
Za to przy czymś takim całkiem inaczej to wygląda:
  1. mysql> SELECT COUNT(*) FROM `c_7` where id < 10000000;
  2. +----------+
  3. | COUNT(*) |
  4. +----------+
  5. | 9999999 |
  6. +----------+
  7. 1 row in set (8.06 sec)
  8.  
  9. mysql> SELECT COUNT(1) FROM `c_8` where id < 10000000;
  10. +----------+
  11. | COUNT(1) |
  12. +----------+
  13. | 9999999 |
  14. +----------+
  15. 1 row in set (8.12 sec)
  16.  
  17. mysql> SELECT COUNT(id) FROM `c_9` where id < 10000000;
  18. +-----------+
  19. | COUNT(id) |
  20. +-----------+
  21. | 9999999 |
  22. +-----------+
  23. 1 row in set (8.16 sec)


Ten post edytował kyku 11.10.2012, 22:16:28


--------------------
eArena.pl - hosting serwerów gier multiplayer
Go to the top of the page
+Quote Post
alegorn
post 12.10.2012, 09:59:33
Post #6





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


a wylaczyles qc ?

testy, by byly miarodajne - powinny byc wykonane na jakiejs probie i wyciagnieta srednia.

poza tym, czasem drastycznie sa zalezne od maszyny - na dwu różnych - mozesz otrzymac skrajne wyniki.

testy maja sens gdy wykonyjemy je na maszynie docelowej z zasymulowanym obciazeniem serwera. w przeciwnym razie mozna sie bardzo zdziwic.

j.
Go to the top of the page
+Quote Post
sazian
post 12.10.2012, 18:56:30
Post #7





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


ten test miały sens gdyby był wykonywany na jednej tabeli lub na identycznych kopiach
co w tym dziwnego że czasy były różne skoro w tabelach były różne ilości rekordów

  1. CREATE TABLE test_count(
  2. id int PRIMARY KEY AUTO_INCREMENT,
  3. dane int NOT NULL DEFAULT 0
  4.  
  5. );
  6.  
  7. DROP PROCEDURE IF EXISTS wypelnienie ;
  8. DELIMITER $$
  9. CREATE PROCEDURE wypelnienie()
  10. begin
  11. DECLARE a INT DEFAULT 0 ;
  12. forloop: LOOP
  13. SET a=a+1;
  14. INSERT INTO test_count VALUES(NULL,round(rand()*5000));
  15. IF a=5000000 THEN
  16. LEAVE forloop;
  17. END IF;
  18.  
  19.  
  20. END LOOP forloop;
  21.  
  22. end$$
  23.  
  24. DELIMITER ;
  25.  
  26. call wypelnienie();
  27.  
  28.  
  29. CREATE TABLE test_count1 SELECT * FROM test_count;
  30. CREATE TABLE test_count2 SELECT * FROM test_count;
  31. CREATE TABLE test_count3 SELECT * FROM test_count;
  32.  
  33.  
  34. SELECT count(*) FROM test_count1 WHERE id>99;
  35. SELECT count(id) FROM test_count2 WHERE id>99;
  36. SELECT count(1) FROM test_count2 WHERE id>99;
  37.  
  38.  

wynik
count(*) 0.281s
count(id) 0.294s
count(1) 0.285s


czyli można uznać że wyniki mieszczą się w granicach błędu.
Myślę że w tym przypadku niema żadnej różnicy ponieważ silnik mysql'a i tak skorzysta z klucza głównego.


Różnice będą wtedy gdy użyjesz kolumnę która nie jest kluczem głównym lub co gorsza jeśli nie jest na tej kolumnie nałożony indeks (oczywiście pomijam różnicę w wyniku jeśli są null'e )
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 10:16