mysql

MySQL – kompresja pól tekstowych

0

Dosyć często w bazach danych używa się dosyć krótkich pól tekstowych – varchar, lub char.
Nie wszyscy jednak wiedzą iż pola te mogą podlegać kompresji, jest tylko jeden warunek.
Jeżeli wielkość kolumny nie przekroczy 8 znaków, dane nie będą kompresowane.
Dla deweloperów może to jednak mieć duże znaczenie. W procesie analizy danych i co za tym idzie tworzenia struktur dla nich staramy się często zminimalizować ich ilość aby nie rezerwować/zajmować niepotrzebnie przestrzeni pamięciowej.

Załóżmy iż chcemy w bazie przechować okrojoną datę w formie RRRR-MM. Na potrzeby tego rodzaju danych programista stworzy kolumne o danych takich jak:

CREATE TABLE test (
testId INT UNSIGNED NOT NULL AUTO_INCREMENT,
shortDate CHAR(7) NOT NULL,
relatedId INT UNSIGNED NOT NULL,
testOptions INT UNSIGNED NOT NULL,
PRIMARY KEY(testId),
KEY (shortDate)
) Engine=MyISAM;

Tym silnika niekoniecznie tutaj ma znaczenie, warto sprawdzic i dla MyISAM oraz dla InnoDB.

Oczywiscie typ char został wybrany ponieważ zawsze dane mają taką samą długość co ułatwia mysqlowi zarządzanie rekordem a przy okazji nie marnuje miejsca.

Po wrzuceniu 1M rekordów za pomocą:

DELIMITER //
CREATE PROCEDURE fillTable()
BEGIN
SET @x:=0;
REPEAT INSERT INTO test
SET shortDate=DATE_FORMAT(NOW() – INTERVAL FLOOR(0 + RAND() * (10000)) DAY, ‘%Y-%m’),
relatedId=FLOOR(1 + RAND() * 10000), testOptions=FLOOR(1 + RAND() * x’7fffffff’);
SET @x = @x + 1;
UNTIL @x > 1000000 END REPEAT;
END //
DELIMITER ;

Wywolanie dodawania rekordow:

call fillTable();

otrzymujemy taką oto wielkość indeksu:

select TABLE_NAME,ENGINE,ROW_FORMAT,DATA_LENGTH,INDEX_LENGTH FROM information_schema.tables WHERE TABLE_SCHEMA=’test’;

+————+——–+————+————-+————–+
| TABLE_NAME | ENGINE | ROW_FORMAT | DATA_LENGTH | INDEX_LENGTH |
+————+——–+————+————-+————–+
| test       | MyISAM | Fixed      |    20000020 |     26477568 |
+————+——–+————+————-+————–+

Jedna drobna zmiana, zdawało by się – na gorsze ;)

ALTER TABLE test CHANGE shortDate shortDate CHAR(8) NOT NULL;

Spójrzmy teraz co stało się z wielkościami indeksów:
select TABLE_NAME,ENGINE,ROW_FORMAT,DATA_LENGTH,INDEX_LENGTH FROM information_schema.tables WHERE TABLE_SCHEMA=’test’;

+————+——–+————+————-+————–+
| TABLE_NAME | ENGINE | ROW_FORMAT | DATA_LENGTH | INDEX_LENGTH |
+————+——–+————+————-+————–+
| test | MyISAM | Fixed | 21000021 | 13034496 |
+————+——–+————+————-+————–+

Co zaszło? Otóż pomimo straty jednego bajta na rekord uzyskaliśmy całkiem sporo na indeksach (50%), co za tym idzie? Mniej operacji IO i szybciej uzyskujemy wyniki… Oczywiscie zmiana jest pozytywna wtedy gdy mocno są obciążone dyski CPU zaś trochę się nudzi.

MySQL, 10 na 90

0

Trochę dziwny tytuł i z pewnością nie każdy na pierwszy rzut oka rozumie o co chodzi, wyjaśnię zatem po krótce.

Nie jest to punktacja dla tejże bazy danych. Jest to tak zwana zasada o lokalności danych.
Twierdzi ona iż 10% kodu wykonuje się 90% czasu. Równie dobrze mógłbym tutaj wrzucić zasadę ‘pareto’ jednak nazwa czy drobna różnica w liczbach zupełnie nie ma tutaj znaczenia. Nie bedę jednak opowiadał o trzewiach tego DBMSa, powiem zaś o czymś co dotyczy każdego użytkownika bazy oraz jego danych.

Wszelkiego rodzaju systemy które teraz wytwarzamy, skoncentrowane są zazwyczaj wokół jednego użytkownika, dla którego gromadzone są dane, lub też wokół czasu w jakim są otrzymywane. Oznacza to, że zalogowanemu użytkownikowi pokazujemy dane które dotyczą tylko jego osoby (wiadomości, koszyki, produkty), lub też dane które dotyczą danego czasu (najświeższe wiadomości, najnowsze promocje, etc). Nieczęsto się zdarza iż przy generowaniu głównej strony serwisu pokazujemy wszystko co tylko znajduje się w bazie. Zazwyczaj jest jakieś ‘ziarno’ wokół którego należy się skupić.
Niestety pomimo iż skupiamy sie na tym ‘ziarnie’ podczas generowania zawartości strony, nie skupiamy się na tym podczas opiekowania się wytworzonym systemem.
(more…)

Jak działa MySQL. MyISAM – Optymalizacje II

3

Artykuł ten jest kontynuacją artykułu “Jak działa MySQL. MyISAM – Optymalizacje I”. Osobom które nie zapoznały się z wcześniejszym materiałem sugeruję przejrzenie go, w innym wypadku część informacji może się wydawać niespójna.

Poprzednio artykuł zakończyłem informacją jak budować zapytania aby stworzony indeks został wykorzystany. Przemilczałem jednak pewne pchające się na usta pytanie. Skąd mamy wiedzieć czy MySQL rzeczywiście wykorzystał indeks, oraz czy wykorzystał indeks właściwy. Ten artykuł chciałbym przeznaczyć właśnie na ten cel.
MySQL prawdę ci powie… Aby dowiedzieć się w jaki wykonywana jest robota najlepiej spytać tego kto pracuje a nie tego kto pracę zleca. MySQL daje nam taką możliwość. Polecenie EXPLAIN potrafi wyjaśnić jak zbudowana jest tabela, oraz jak wykona się dane zapytanie.

(more…)

Jak działa MySQL. MyISAM – Optymalizacje I

5

Kolejnego posta czas zacząć. Tym razem 0day padł na MySQL i działanie MyISAM.
Nie będę się tutaj rozpisywał o podstawach MySQL mam zamiar jedynie opisać ja działa MyISAM (i to dosyć ogólnikowo) oraz jak optymalizować zapytania i strukturę bazy tak aby wszystko dobrze działało.

Oczywiście mógłbym pisać tylko o optymalizacji i nie wspominać o budowie, jednak w takim wypadku jest to podanie ryby zamiast wędki.
Nie da się tutaj wszystkich możliwych ścieżek opisać, rozumiejąc jednak zasady działania można w prosty sposób optymalizować wszelkie inne zapytania. Nie są to tylko regułki w stylu: będzie szybciej jeżeli użyjesz tego czy tamtego…

Na początek chciałbym przestrzec że nie widzę siebie jako megaeksperta od wszystkiego. Lubię dłubać i szukać. Optymalizacja i uczenie się jak co działa, to moje małe hobby.

No dobrze to może od początku. MySQL ma wiele silników zarządzających danymi. Na dzień dzisiejszy najczęściej używanymi są MyISAM, InnoDB, Cluster. W kolejnych artykułach postaram się umieścić opisy dla kolejnych silników, łącznie z silnikami które są jeszcze w fazie wytwarzania. Samo rozbicie na kilka osobnych artykułów podyktowane jest ich objętością. Nie sposób w kilku sensownych słowach zawrzeć szereg przydatnych informacji dotyczących tak rozbudowanych mechanizmów.

Wracając do MyISAM’a jest to stosunkowo najprostszy i szybki silnik (jeżeli chodzi o pobieranie danych) z omawianej bazy danych. (more…)

Go to Top