MySQL umożliwia zastosowanie różnych rodzajów formatów rekordów – w zależności od silnika opcji może być kilka. InnoDB to formaty ‘compact’ i ‘redundant’. MyISAM – ‘fixed’ i ‘dynamic’. Memory – ‘fixed’. Cechą charakterystyczną formatu fixed jest to, że każdy rekord posiada dokładnie taką samą długość. To przekłada się na kilka sporych zalet – szybsze wyszukiwanie danych (MySQL dokładnie wie w którym miejscu tabeli zacząć szukać danego rekordu – może sobie obliczyć biorąc pod uwagę długość rekordu i jego “numer”), mniejszy problem z fragmentacją (po skasowaniu jednego rekordu w jego miejsce bez problemu trafi inny – ich długość jest w końcu identyczna).

Tenże format od zawsze stosowany jest także w silniku Memory. Problem w tym, że oprócz zalet zastosowanie FRF (Fixed Row Format) niesie także ze sobą wady. Główną jest to, że format ten uniemożliwia zastosowanie kolumn typu BLOB czy TEXT. W efekcie, tabela tymczasowa, którą można by umieścić w pamięci, musi zostać utworzona na dysku ze względu na format kolumn w niej się znajdujących. Często jest tak, że format tych kolumn jest wybrany w sposób niewłaściwy – ile to razy widziałem kolumnę typu TEXT przeznaczoną na przechowywanie id rekordu, czyli po prostu danych typu INTEGER. Często jednak nie ma prostego rozwiązania i, aby uniknąć tworzenia tabeli tymczasowej na dysku, trzeba stosować różne konstrukcje i modyfikacje zapytania.

Wraz z Percona Server 5.5.15 pojawiło się światełko na końcu tunelu. Percona wprowadziła możliwość zastosowania DRF (Dynamic Row Format) w silniku Memory. Udało się im doprowadzić do stanu używalności kilka starych patchy wprowadzających do silnika Memeory kolumny typu VARCHAR, dołożyli trochę swojego kodu dodając wsparcie dla BLOB i TEXT. Efekt nie jest do końca idealny – są pewne ograniczenia. Przykładowo, wszystkie indeksowane kolumny muszą być zadeklarowane przed kolumnami o zmiennej długości (czyli VARCHAR, BLOB). Bierze się to z tego, że rekord został rozbity na dwie części – pierwsza, zawierająca indeksy, jest typu ‘fixed’ a druga, mogąca zawierać kolumny o zmiennej długości, jest typu ‘dynamic’. Potencjalnym problemem jest też to, że nie ma możliwości nakładania indeksów na kolumny typu BLOB.

Na ten moment, niestety, nie ma jeszcze możliwości aby MySQL używał tego typu tabel jako tabel tymczasowych. Ten element pozostaje bez zmian. Z informacji zawartych w sieci można wywnioskować, że dalsze prace nad zniesieniem tego ograniczenia trwają intensywnie. Jeśli się to uda, będzie to znaczny skok wydajności i spore zmniejszenie obciążenia podsystemu dyskowego serwerów MySQL. Pozostaje mieć nadzieję, że prace uda się zakończyć w miarę szybko.