Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Select (CO?)
Forum PHP.pl > Forum > Bazy danych > MySQL
mimol
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?
Szymciosek
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.
mimol
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 *
Crozin
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.
kyku
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)
alegorn
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.
sazian
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 )
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.