Marcin Chyłek Blog

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

PDO prepared statements a wydajność zapytań SQL

Na forum php.pl pojawił się post z pytaniem czy zastosowanie prepared statements wpływa na wydajność zapytań.

Troszeczkę teorii:

Jak to wygląda od strony ORACLE:

Zanim dane zostaną zwrócone z bazy danych, po odebraniu odpowiedniego kodu baza danych Oracle musi wykonać określone czynności:

  • tworzenie kursora
  • proces parsowania zapytania jeśli nie istnieje w obszarze wspólnym. Na proces ten również wchodzi kilka etapów:
    • analiza zapytania - sprawdzenie czy zapytanie składniowo jest poprawne
    • sprawdzenie odwołań do obiektów
    • sprawdzenie uprawnień
    • modyfikacja zapytania, w celu uzyskania zapytania równoważnemu danemu, ale wykonywanemu efektywniej
    • przygotowanie planów wykonania na podstawie statystyk, wskazówek
    • wybranie najlepszego planu wykonania (najmniejszy koszt wykonania)
    • zapisanie do obszaru wspólnego

    Wykorzystanie wcześniejszego zapytania jest możliwe tylko wtedy, kiedy:

    • tekst zapytania jest taki sam (wchodzą w to również komentarze i białe znaki),
    • polecenie musi odwoływać sie do tych samych obiektów w bazie danych,
    • zmienne wiązane muszą się tak samo nazywać i być tego samego typu.
  • przygotowanie zapytania
  • podwiązanie zmiennych
  • wykonanie zapytania
  • zwrócenie rekordów do użytkownika

Jeśli do bazy danych jest wysyłane takie samo zapytanie proces parowania nie jest wykonywany, przez co wydajność wzrasta bo pewna czść operacji jest pomijana.

Czy zawsze stosować takie rozwiązanie?

Są przypadki zapytań dla których najlepszy plan pierwszego wykonania dla pewnych parametrów jest nieoptymalny i zaleca się nie stosowanie zmiennych wiązanych.

MySQL:

Jeśli chodzi o bazę danych MySQL mechanizmy nie są aż tak bardzo zaawansowane ale pewne rzeczy są zaimplementowane.

Więcej na stronie: http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

Jak PDO wpływa na wydajność

PDO udostępnia funkcje do tzw bind’a (w literaturze polskiej spotkałem się z określeniem zmienna wiązana), w którym możemy przekazać wartość jaka ma być podstawiona pod zmienną, która w późniejszym etapie zostanie wysłana do bazy. Możemy wysłać zapytanie tylko jeden raz, następnie podstawiać wielokrotnie a następnie wykonywać. Dodatkowo PDO chroni przed atakami SQL Injection.

Post z forum.php.pl: http://forum.php.pl/mysqli-prepared-statements-t54025.html

Kategoria: Bazy danych, PHP | Marcin Chyłek | Komentarze: 0