Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Need for Speed, czyli rozważania dotyczące prędkości
W czym wolisz zapisywać dane?
W czym wolisz zapisywać dane?
Pliki Txt (mechanizmy PHP) [ 37 ] ** [11.08%]
Baza MySQL [ 297 ] ** [88.92%]
Suma głosów: 192
Goście nie mogą głosować 
DeyV
post
Post #1





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Od dawna stosowane są mechanizmy służące do zapisywania wyników z bazy danych w plikach tekstowych, w celu przyspieszenie pracy skryptów (cash). I jest to całkiem logiczne, szczególnie w przypadku bardziej złożonych zapytań.
Jednak ostatnio, chyba wraz z pojawieniem się najnowszej wersji xmb_forum (Partagium) zwróciłem uwagę na nową tendencję: zastępowanie plików tekstowych bazą danych. W forum tym wszystkie pliki szablonów (templates) zostały umieszczone w bazie. I przyznam się szczerze, że mocno mnie to zaskoczyło. Bo choć do zalet stosowania zapisu w bazie chyba nikogo nie trzeba przekonywać (łatwość w aktualizacji, katalogowaniu, brak problemów z nadawaniem CHMOD itp.) to jednak przekonany byłem, że rozwiązanie takie musi być o wiele wolniejsze.
Skłoniło mnie to do przeprowadzenia serii testów. Umieszczam tu kilka z wyników, które mam nadzieję skłonią Was do zastanowienie się nad tym tematem. Wszystkie zostały wykonane przy pomocy malutkiego skryptu zapisującego i przeliczającego wyniki, który można ściągnąć stąd:
www.mStudio.nQ.pl/download/scrypty/czas/czas.zip na Windows XP, z Apachem 1,3, php 4.3 oraz MySQL 3.23
A tu jest przykład kodu testów

A1. wyświetlamy zawartość małego pliku (1,4 KB) z pliku tekstowego (wyniki w sekundach):
Cytat
Ilość prób=20
średni czas = 0.00299039483070
max czas=0.0046200752;
min_czas= 0.0020439625
suma = 0.0598078966
A2. Ten sam tekst z bazy MySQL zawierającej tylko ten jeden rekord:
Cytat
Ilość prób=20
średni czas = 0.00293679833412 (mniej niż z pliku !)
max czas=0.0047850609;
min_czas= 0.0023930073
suma = 0.0587359667
A3. Taki sam tekst, lecz z tabeli zawierającej około 200 rekordów
Cytat
Ilość prób=20
średni czas = 0.00319704413414
max czas=0.0045739412
min_czas= 0.0025489330
suma = 0.0639408827

-----------------------------

B1. wyświetlamy zawartość pliku (61 KB) z pliku tekstowego (wyniki w sekundach):
Cytat
Ilość prób=20
średni czas = 0. 07095720171928
max czas=0. 1114130020;
min_czas= 0. 0573480129
suma = 1. 4191440344
B2. Ten sam tekst z bazy MySQL zawierającej tylko ten jeden rekord:
Cytat
Ilość prób=20
średni czas = 0. 09079620242119  
max czas=0. 1551539898;
min_czas= 0. 0670330524
suma = 1. 8159240484
B3. Taki sam tekst, lecz z tabeli zawierającej około 200 rekordów
Cytat
Ilość prób=20
średni czas = 0. 08866938948631
max czas=0. 1459870338
min_czas= 0. 0688790083
suma = 1. 7733877897
Podsumowanie:
Pliki rzeczywiście zazwyczaj są szybsze, ale nie tak bardzo, jak by się mogło wydawać. Zaskakujące efekty dało również porównanie wyników MySQL. Okazało się, że wielkość bazy (przynajmniej w porównaniu 1-200) nie ma wpływu na prędkość wykonywania zapytań. Czasami wręcz (sic!) większa baza jest szybsza...
Co o tym sądzicie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
dragossani
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

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


Prędkość liniowego odczytu danych z bazy jest zwykle porównywalna z odczytem z systemu plików. Tutaj nie ma co szukać przewagi któregoś z rozwiązań - jeśli wszystko jest dobrze skonfigurowane to różnice powinny być na poziomie błędu statystycznego.
Co innego jeśli chcemy czegoś poszukać - tutaj baza jest absolutnie bezkonkurencyjna. Dlatego jeśli potrzebujemy wydajności, najlepiej trzymać co się da w bazie danych i zadbać równocześnie o to, żeby sama baza i sprzęt na którym pracuje były skonfigurowane optymalnie. Na co warto zwrócić uwagę?

Jeśli to możliwe, należy przygotować sobie osobną maszynę dla bazy danych i połączyć szybką sieciówką z serwerem www. Najważniejszymi elementami serwera bazodanowego są dyski twarde i pamięć ram. Jeśli chodzi o dyski to świetnie podnosi wydajność konfiguracja typu raid-0. Jeśli musimy liczyć się z kosztami to możemy zacząć od kupna płyty głównej z kontrolerem raid (zwykle różnica cenowa jest niewielka) i dwóch identycznych dysków twardych ATA. Dobrze jeśli dysk ma 8MB cache - przy intensywnym użytkowaniu jest to ważne. Dla przykładu w hurtowni Maxtor DiamondMax +9 80 GB (ATA/133, 8MB cache) kosztuje około 500 PLN. Połączenie dwóch takich dysków w system raid-0 daje nam jeden dysk o pojemności 160GB, w dodatku o wydajności 195% pojedynczego. Jeśli ktoś cierpi na nadmiar gotówki to polecam specjalny kontroler scsi raid i do tego kilka dysków takich jak np. Seagate Cheetah X15K.3 36.7 GB - to cudeńko ma 15.000 obr./min i średni czas dostępu na poziomie 4,3 ms - tylko niestety słono kosztuje. Ram powinien być szybki, ale nie należy przesadzić. DDR-433MHz Corsair we wspólpracy z Athlonem 2000+ zachowuje się nieprzewidywalnie. Najlepiej zadbać po prostu o synchronizację procesora z ramem. Czyli np. Athlon 2600+ (szyna 333MHz) i DDR-RAM Kingston'a 333MHz to najzdrowsze zestawienie.

Kilka słów o konfiguracji MySQL'a. Zakładam, że jeśli ktoś wydał kasę na sprzęt to teraz chce oszczędzić na sofcie i instaluje na serwerze linuxa - słuszne posunięcie. :wink: (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Jak powinien wyglądać plik konfiguracyjny MySQL'a? Oczywiście muszą w nim być podstawowe informacje:
Kod
[mysqld]

#kodowanie znaków

language = polish

default-character-set = latin2



#katalog z danymi

datadir = /home/mysql/data



#pliki logów

log = /var/log/mysql/mysqld.log

log-update = /var/log/mysql/modify.log
Logi mogą nam oczywiście zacząć rosnąć w niepochamowanym tempie, w związku z czym trzeba pomyśleć o ich rotacji. Jeśli chodzi o dostosowywanie ustawień bazy danych do specyfiki sprzętowej to warto zerknąć do przykładów w podkatalogu /support-files. Dobre dobranie buforowania pozwoli nam wycisnąć ze sprzętu co się da. Jeśli mamy niezbyt wydajną platformę sprzętową nasz plik my.cnf może wyglądać tak:
Kod
#Ustawienia globalne klientów

[client]

#password             = your_password

port                  = 3306

socket                = /tmp/mysql.sock



#Ustawienie serwera

[mysqld]

language              = polish

default-character-set = latin2

datadir               = /home/mysql/data

log                   = /var/log/mysql/mysqld.log

log-update            = /var/log/mysql/modify.log

port                  = 3306

socket                = /tmp/mysql.sock

skip-locking

set-variable          = key_buffer=16M

set-variable          = max_allowed_packet=1M

set-variable          = table_cache=64

set-variable          = sort_buffer=512K

set-variable          = net_buffer_length=8K

set-variable          = myisam_sort_buffer_size=8M



#log-bin

server-id             = 1



[mysqldump]

quick

set-variable          = max_allowed_packet=16M



[mysql]

no-auto-rehash



[myisamchk]

set-variable          = key_buffer=20M

set-variable          = sort_buffer=20M

set-variable          = read_buffer=2M

set-variable          = write_buffer=2M



[mysqlhotcopy]

interactive-timeout
Jeśli natomiast kupiliśmy sobie mocny serwer to musimy umożliwić mysql'owi wykorzystanie go odpowiednio. Co warto więc zmodyfikować?
Kod
#w sekcji mysqld

[mysqld]

set-variable = key_buffer=384M

set-variable = table_cache=512

set-variable = sort_buffer=2M

set-variable = record_buffer=2M

set-variable = thread_cache=8

set-variable = myisam_sort_buffer_size=64M

#jeśli mamy więcej niż 1 procek

set-variable = thread_concurrency=8

#w sekcji myisamchk

[myisamchk]

set-variable = key_buffer=256M

set-variable = sort_buffer=256M
To tyle w zarysie jeśli chodzi o wydajność samej bazy danych.
Go to the top of the page
+Quote Post

Posty w temacie
- DeyV   Need for Speed, czyli rozważania dotyczące prędkości   27.01.2003, 15:54:08
- - It's_me   Jezeli chodzi o mnie to ja zawsze bylem bazodanowc...   27.01.2003, 16:21:36
- - scanner   Odkąd przerzucilem sie z plików na BD, to nie mam ...   29.01.2003, 12:03:36
- - DeyV   Jednak pojawia się pytanie: Jak daleko się posuwać...   29.01.2003, 12:21:59
- - kurtz   Re: Need for Speed, czyli rozważania dotyczące prędkości   29.01.2003, 12:32:32
- - dragossani   Prędkość liniowego odczytu danych z bazy jest zwyk...   29.01.2003, 13:29:53
- - Seth   A co sadzicie o XMLu jako pewnym zamienniku bazy d...   2.02.2003, 13:17:22
- - dragossani   Od biedy można spróbować posłużyć się XML'em jako ...   3.02.2003, 11:52:54
- - Seth   Czyli XML tylko jako wzorzec ?   3.02.2003, 12:56:08
- - dragossani   No, powiedzmy jako źródło informacji na poziomie s...   4.02.2003, 14:21:55
- - Seth   juz rozumiem   4.02.2003, 15:51:44
- - Mati   ...   14.02.2003, 01:48:37
- - Picia   Bazy pliki i inne...   17.07.2003, 17:51:34
- - Omega   W sumie pliki są bardziej powszechne... W necie o ...   17.07.2003, 17:59:34
- - e-Gandalf   Re: Bazy pliki i inne...   17.07.2003, 18:44:55
- - Omega   Z tego co wiem płatna licencja jest potrzebna gdy ...   17.07.2003, 19:16:56
- - Picia   Licencja i Widoki   17.07.2003, 19:17:14
- - borec   ja tam jestem za mysql po 1. 0.001 sek to dla mni...   19.07.2003, 12:33:01
- - e-Gandalf   Cytatpo 3. jak sie ma szybkiego serwa to tylko wyg...   19.07.2003, 12:41:43
- - squid   CytatJednak pojawia się pytanie: Jak daleko się po...   19.07.2003, 14:45:15
- - Omega   Pliki są wygodniejsze nie tylko dla mn iejszych st...   20.07.2003, 14:24:47
- - lewal   cale rozwazania tocza sie nad przewaga plikow nad ...   23.10.2003, 02:12:10
- - msulik   Jaką pamięć masz na myśli? Mówisz o shared memory ...   12.11.2003, 00:52:12
- - DaNTe   CytatZ tego co wiem płatna licencja jest potrzebna...   18.02.2004, 23:43:33
- - dooshek   Z MySQLem jest tak, ze tak na prawde jest bardzo w...   19.02.2004, 22:52:31
- - enceladus   Z doświadczenia polecam stosowanie squid-a w roli ...   20.02.2004, 00:14:10
- - halfik   CytatZ MySQLem jest tak, ze tak na prawde jest bar...   25.02.2004, 15:46:29
- - RoVeR   Ja używam plikuw *.php jako bazy i mam to co z txt...   26.02.2004, 07:27:32
- - halfik   CytatJa używam plikuw *.php jako bazy i mam to co ...   28.02.2004, 12:19:49
- - bamboos   Witam!! Ja na serverze nie mam dostępu do bazy dan...   28.02.2004, 13:05:01
- - enceladus   Tak wlasnie sobie to czytam i pomyslalem że cała d...   28.02.2004, 13:11:01
- - bigZbig   Powtorze za poprzednikiem, że nie ma sensu prowadz...   26.08.2004, 14:52:19
- - ActivePlayer   Pisalem ostatnio database_layer z automatyczną obs...   28.08.2004, 00:02:29
- - squid   Cytat(bigZbig @ 2004-08-26 15:52:19)Natomiast...   11.09.2004, 12:03:55
- - Vertical   W bazie po prostu piszesz zapytanie, a baza zwraca...   28.09.2004, 09:56:59
- - Krolik   CytatCytat Z MySQLem jest tak, ze tak na prawde je...   22.11.2004, 11:10:44
- - awides   mysql -> dane pliki cache -> buforowanie   22.11.2004, 23:02:01
- - ShaXbee   To mój pierwszy post na Forum php Pro. Oby wyszedł...   19.01.2005, 22:22:11
- - bela_666   Cytat[Error : Błąd] [404] File Not Found : Plik n...   20.01.2005, 00:43:12
- - hawk   Pomijając prostą kwestię istnienia lub nie istnien...   20.01.2005, 09:05:31
- - ShaXbee   I tu tkwi problem. Uzywam PHP5 i SimpleXML. Nieste...   20.01.2005, 13:12:52
- - hawk   Co do SimpleXML: to jest znany bug php. Workaround...   20.01.2005, 14:37:55
- - bela_666   Cytat(hawk @ 2005-01-20 14:37:55)Co do shm: a...   20.01.2005, 15:18:21
- - hawk   System plików siedzący w pamięci. Link: http://www...   20.01.2005, 17:35:11
- - Krolik   Linux automatycznie cache'uje pliki w pamieci....   21.01.2005, 13:46:16
- - squid   MySQL i pewnie inne bazy ma typ tabeli ktora przet...   21.01.2005, 23:19:45
- - NuLL   IMHO - dyskusja lekko pozbawiona sensu - trzebaby ...   22.01.2005, 17:29:25
- - awides   @squid chodzi ci pewnie o HEAP, jest jeden problem...   23.01.2005, 09:40:36
- - NuLL   Trochę odgrzeje jeśli można Co jest lepsze czyst...   8.06.2005, 22:52:45
- - bela_666   Hwao gdzieś benchmark zrobił, poszukaj   8.06.2005, 23:22:53
- - chmolu   W moich testach zapisywanie zawartości pliku ini j...   9.06.2005, 05:23:56
- - NuLL   Dzięki - u mnie też tak wynikło choć trochę nie ch...   9.06.2005, 17:08:10


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: 4.10.2025 - 12:50