Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Co jest szybsze?
Forum PHP.pl > Forum > Przedszkole
!*!
Pytanie może dość banalne ale, mam ok 20 000 rekorodów każdy z nich ma folder, co jest szybsze w odczycie danych? Sprawdzenie rekordu w mysql czy sprawdzenie czy folder istnieje? Np. w przypadku istnienia folderu dopiero później łączę się z bazą w celu odczytu innych danych.
nospor
Cytat
mam
Skoro masz to sprawdź i podziel się z nami wynikami swojego testu smile.gif
elpaw
W większości przypadków baza będzie szybsza.
!*!
  1. <?php
  2. unction gen_www()
  3. {
  4.    $czas = microtime( );
  5.    $czas = explode( " ", $czas );
  6.    return $czas[1] + $czas[0];
  7. }
  8.  
  9. $start = gen_www();
  10.  
  11. //kod który sprawdza
  12.  
  13. $stop = gen_www();
  14. $cos = substr( $stop - $start, 0, 7 );
  15. echo "Czas generowania strony {$cos}s";
  16. ?>


Kod do sprawdzenia dla folderu:

  1. <?php
  2. $folder="dolny";
  3. if(is_dir(''.$folder.'')) {
  4.   echo 'Istnieje <br />';
  5. }else{
  6.  echo 'Nie istnieje<br />';
  7. }
  8. ?>


Kod dla bazy:

  1. <?php
  2. $login = 'dolny';
  3. if ($login){
  4.  
  5.  
  6. $sprawdzlogin = mysql_query("SELECT login FROM userdata WHERE login = '$login' LIMIT 1 ");
  7. $wyniksprawdz = mysql_num_rows($sprawdzlogin);
  8. }
  9.  
  10. if ($wyniksprawdz == 1) {$errorwys=1;echo "istnieje";}
  11. ?>


Wynik:

Kod
Czas dla folderów:

0.00024s
0.00029s


Kod
Czas dla bazy:

0.00037s
0.00034s


Rekordów i folderów było zaledwie 50.

nospor - jestem ciekaw czy ktoś już to sprawdzał, ma jakieś doświadczenia z tym związane... Co jest bardziej wydajne przy większej liczbie itp. są jakies rozwiązania? Jeśli tak to jakie?
drPayton
Info: 20000 folderów i tyleż odpowiadających im rekordów w bazie danych.
Test: Sprawdzenie istnienia folderu o określonej nazwie.
Kod testowy:
  1. <?php
  2. mysql_connect('****', '****', '****');
  3.  
  4. echo '<br />Sprawdzenie istnienia folderu o określonej nazwie:';
  5.  
  6. $start = microtime();
  7. mysql_query("SELECT id FROM test_big_table WHERE folder = 'folder_12345'");
  8. echo '<br /><br />Baza danych: ' . (microtime() - $start) . ' sekund(y)';
  9.  
  10. $start2 = microtime();
  11. is_dir('folders/folder_12345');
  12. echo '<br />System plików: ' . (microtime() - $start2) . ' sekund(y)';
  13. ?>


Wyniki:

1. Brak indeksów w bazie:
Kod
Baza danych: 0.016986 sekund(y)
System plików: 0.001505 sekund(y)

Kod
Baza danych: 0.01789 sekund(y)
System plików: 0.001337 sekund(y)

Kod
Baza danych: 0.016653 sekund(y)
System plików: 0.00139 sekund(y)

Kod
Baza danych: 0.017132 sekund(y)
System plików: 0.001288 sekund(y)

Kod
Baza danych: 0.01752 sekund(y)
System plików: 0.00128 sekund(y)


2. Założony indeks na polu zawierającym nazwę folderu:
Kod
Baza danych: 0.000307 sekund(y)
System plików: 0.001344 sekund(y)

Kod
Baza danych: 0.000303 sekund(y)
System plików: 0.001227 sekund(y)

Kod
Baza danych: 0.000392 sekund(y)
System plików: 0.001147 sekund(y)

Kod
Baza danych: 0.000427 sekund(y)
System plików: 0.001406 sekund(y)

Kod
Baza danych: 0.000359 sekund(y)
System plików: 0.001149 sekund(y)



Wnioski - zakładając odpowiedni indeks baza danych jest o wiele szybsza smile.gif
!*!
Niby ino kurde jo, ale... Indeks ma to do siebie że jeśli np. mam rekord i folder "domek", to po np. wyszukaniu "dom" wyświetli się "domek" bo on został zindeksowany.
drPayton
Eeee?

(...) LIKE '%dom%' (...)

wyświetli również 'domek', ale

(...) LIKE 'dom' (...)

tylko 'dom'

Albo nie rozumiem w czym problem...
!*!
LIKE nie jest dobrym rozwiązaniem... albo inaczej, jest dobry pod waruniem że mamy bardzo mało rekordów. Normalnie używam [czyliw w przypadku znacznej większej liczby rekordów]:

Kod
SELECT willa FROM data WHERE MATCH(willa) against ('$wynik*' IN BOOLEAN MODE)
phpion
Ja również nie rozumiem. Najpierw chcesz sprawdzić czy folder o konkretnej nazwie istnieje, a potem wchodzisz w wyszukiwanie pełnotekstowe. Stwórz zwykły indeks i przeszukuj bazę poprzez zwykłe porównanie (pole = 'dom').
Pilsener
Dostęp do dysku jest wyraźnie szybszy niż do bazy - ale tylko dostęp. Im większe obciążenie serwera i większa liczba danych tym większa przewaga bazy - powyżej pewnej ilości praktycznie nie da się już tego robić na plikach/folderach etc.
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.