Marcin Chyłek Blog

Cache danych w PHP - testy wydajności (MEMORY, MyISAM, Plik)

Przeprowadziłem kilka testów szybkości odczytu z pliku i tabel typu: MEMORY, MyISAM.

Jak był przeprowadzany test:

Test przeprowadzałem na Ubuntu Dapper (apache2, php5.1.x, MySQL 5.0.22) na laptopie, więc wiele rzeczy mogło wpłynąć na na nieprawidłowość testów.

Test podzieliłem na kilka etapów:

  • z włączonym cache zapytań
  • z wyłączonym cache zapytań
  • z pomiarem połączenia z bazą danych

Odnośnie ilości wywołań testu, to był wykonywany 1000 razy, liczone były pojedyńcze czasy testu, a następnie sumowane i liczona z tego średnia testu. Jako danych testowych użyłem wygenerowanego ciągu znaków o długości około 65 KB.

Wyniki:

Odczyt z pliku:

Do odczytu z pliku użyłem funkcji: file_get_contents()
Średni czas odczytu jaki uzyskałem to: 0.000357507705688 (szczegółowe informacje)

Odczyt z bazy danych:

Do odczytu z bazy użyłem funkcji mysql_* (połączenie, wybór bazy, wykonanie zapytanie i zwrócenie rekordu). Tabela zawierała 1 rekord z id i polem w którym był zapisany taki sam ciąg znaków jak w przypadku pliku. Dlaczego nie więcej? Chciałem wyeliminować czas jaki będzie potrzebny na przeliczenie jaki rekord ma zostać zwrócony.

Wyłączony zapis cache w MySQL i czas połączenia z bazą pominięty:

Tabela MyISAM - średni czas to: 0.00516110825539 (szczegółowe informacje)
Tabela MEMORY - średni czas to: 0.00368802952766 (szczegółowe informacje)

Widać, że odczyt z pliku ma przewagę nad odczytem z bazy danych, a czasy odczytu z tabel typu MyISAM i MEMORY są bardzo do siebie zbliżone.

Włączony zapis cache w MySQL i czas połączenia z bazą pominięty:

Tabela MyISAM - średni czas to: 0.00179107260704 (szczegółowe informacje)

Tabela MEMORY - średni czas to: 0.000719551563263 (szczegółowe informacje)

Z włączonym cache zapytań widać, że czasy są zbliżone do odczytu z pliku.

Włączony zapis cache w MySQL + czas połączenia z bazą danych:

Tabela MyISAM - średni czas to: 0.00202487516403 (szczegółowe informacje)
Tabela MEMORY - średni czas to: 0.00205611944199 (szczegół?owe informacje)

Kluczowym znaczeniem jest czas połączenia z bazą danych a porównanie tych 2 testów zapytań do bazy danych można powiedzieć, że są prawie identyczne.

Różnice w wydajności pomiędzy MyISAM i MEMORY?

Typ tabeli MEMORY będzie lepszy zawsze, kiedy operujemy na pewnym zestawie rekordþw i nie musimy jak w przypadku MyISAM odczytywac z dysku, który jak wiadomo ma fizyczne ograniczenia, które są nie do przeskoczenia.

Polecam zapoznanie się z art. http://dev.mysql.com/tech-resources/articles/mysql_5.0_psea2.html, w którym autor porównał różne typy tabel.

Kategoria: MySQL, PHP | Marcin Chyłek | Komentarze: 0

MySQL - ENGINE MEMORY - typ tabeli przeznaczony dla cache

Wydajność w bazach danych odgrywa kluczową rolę, więc optymalizacja i wprowadzanie nowych mechanizmów jest nieuniknione. Engine MEMORY w MySQLu od pewnego czasu już istnieje, to chciałbym przedstawić ten typ tabeli jako alternatywa dla cache zapisywanego w pliku na dysku.

Czym jest MEMORY?

Typ MEMORY, wcześniej HEAP (od wersji 4.1 rekomendowaną nazwą jest MEMORY) - jest to jeden z licznych typów w tabeli charakteryzujący się sposobem przechowywania danych. Jak sama nazwa wskazuje dane są przechowywane w pamięci operacyjnej, więc odczyt, jak i operacje na danych są wykonywane “błyskawicznie”. Jednym z największych problemóww związanych z wydajnością baz danych są operacje wejścia/wyjścia (zapisu/odczytu danych z HDD). Minusem jest to że po wyłączeniu zasilania dane z pamięci operacyjnej są usuwane. Definicja tabel jest trzymana na dysku (nazwa tabeli .frm), więc struktura po wyłączeniu zasilania nie zmienia się.

Gdzie stosować tabele MEMORY?

Głównym zastosowanie tego typu tabel jest tworzenie rozmaitych buforów cache i przechowywanie tymczasowych informacji, których utrata nie powoduje większych szkód a operacje na danych w pamięci mogą przyśpieszyć działanie serwisów WWW.

Czy MEMORY lepsze od cache zapisanego do pliku?

Trudno powiedzieć, z jednej strony na pewno tak bo dane są trzymane tylko w pamięci i operowanie na nich wykonywane jest bez wykorzystania operacji wejścia/wyjścia ale minusem jest proces nawiązywania połączenia, następnie etap parsowania, sprawdzania i wykonania zapytania. Wszystko zależy od przeznaczenia i oczywiście danych ale na pewno tego typu tabele są alternatywą do cache zapisywanego do pliku, który jest obecnie najczęściej wykorzystywany.

Jak używać tabel MEMORY?

Tabele MEMORY w budowanie i wykorzystaniu nie różnią się niczym szczególnym. Jedną z znaczących różnic jest to, że pewne typy pól nie występują (Blob, Text), wiąże się to z miejscem zajmowanym w pamięci. Kolejną zmiana jest użycie indexu.

Definiowanie i użycie tabel MEMORY

Definiowanie tabeli:

CREATE TABLE tabela (id INT) ENGINE = MEMORY

Użycie Tabeli:

SELECT * FROM tabela
Kategoria: Bazy danych, MySQL | Marcin Chyłek | Komentarze: 0