Kształcenie Ustawiczne odpowiedzią na zapotrzebowanie rynku pracy

Transkrypt

Kształcenie Ustawiczne odpowiedzią na zapotrzebowanie rynku pracy
Wyższa Szkoła Technologii
Teleinformatycznych w Świdnicy
Internetowe bazy danych
wykład 3
dr inż. Jacek Mazurkiewicz
e-mail: [email protected]
Typy tabel MySQL



domyślny – MyISAM
inne możliwe: Merge, Heap, InnoDB, BDB
jedna baza – różne typy tabel możliwe
Kryteria wyboru


tabela transakcyjna – transaction-safe table – TST: InnoDB, BDB
tabela nietransakcyna – non-transaction-safe table – NTST:
MyISAM, Merge, Heap
Czy transakcje potrzebne?


w aplikacjach WWW tabele transakcyjne nie są potrzebne
bezstanowe środowisko HTTP nie wymaga zatwierdzania i
odwoływania – operacje nie są skomplikowane i nie jest konieczna
niezależność, transakcja jako logika PHP
Tabele transakcyjne – zalety:






dane bardziej bezpieczne, można je odtworzyć gdy serwer
MySQL lub system się załamie
odtworzenie danych automatyczne lub ręczne na podstawie
kopii zapasowej i dziennika tabeli
łączenie kilku instrukcji SQL w jeden zbiór – transakcję – zbiór
taki to jedna, atomowa operacja
albo zrealizują się wszystkie operacje ze zbioru albo żadna z
nich
można odwołać dotychczas wykonane operacje gdy akcja
zostanie przez użytkownika anulowana lub któryś z kroków się
nie powiedzie
można także odwołać operacje gdy współpraca interakcja
użytkownika z aplikacją bazodanową WWW będzie podejrzana
Tabele nietransakcyjne – zalety:



są znacznie szybsze – zapewnienie bezpieczeństwa danych i
zarządzanie nimi jest czasochłonne
zużywają mniej zasobów – tak dysku, jak i pamięci
prostsza idea konstrukcyjna
CREATE TABLE winery (
winery_id int(4) NOT NULL,
winery_name varchar(10) NOT NULL,
region_id int(4) NOT NULL,
PRIMARY KEY (winery_id),
Przykład tworzenia
KEY name (winery_id),
InnoDB
KEY region (region_id)
) type = InnoDB;



MyISAM, Merge, Heap, InnoDB – dostępne od MySQL 4
BDB – trzeba wkompilować w serwer
jak zakładamy tabelę, która nie jest realizowana – MyISAM
tabeli
MyISAM:









bardzo szybkie wykonywanie zapytań, czasochłonność modyfikacji danych
niewielka
trzy wbudowane mechanizmy przechowywania danych – łatwość tworzenia
tabel o różnych konstrukcjach
najlepiej dopasowana do aplikacji WWW
blokowanie tabel – jedna lub wiele tabel jest niedostępnych wtedy dla innych
użytkowników
blokady potrzebne na krótko – DELETE i UPDATE na grupach wierszy –
szybko, dostęp – index, klucz główny
blokady rzadko potrzebne – odczytów dużo więcej niż zapisów,
współbieżność nie jest nagminna
jedynie blokowanie – grupowanie GROUP BY – generalnie dostęp do
większości wierszy w tabeli
zarządzanie współbieżnymi uaktualnieniami – automatyczna kopia nowych
danych, reszta (SELECT) czyta niezmienione – wersjonowanie danych
atrybuty stałej długości – na dysku wiersze stałej długości, szybki dostęp,
łatwość rekonstrukcji, zmienna długość - dynamiczna
InnoDB (1):








ogólnego przeznaczenia, alternatywa do MyISAM
tabele transakcyjne – obecny FOREIGN KEY, zatwierdzanie, odwoływanie
operacji, odzyskiwanie danych, blokowanie wierszy
zalety rzadko przewyższają wady w świecie WWW – lepiej MyISAM
COMMIT I ROLLBACK – zbiór instrukcji SQL to jeden blok, albo zrobi się
wszystko, albo nic
elastyczne, szybkie blokowanie na poziomie wierszy – blokowane są wiersze,
gdzie realizuje się zapytania i uaktualnienia, a nie całe tabele jak w MyISAM
– sprawniejsze niż w MyISAM przy dużej liczbie użytkowników
ograniczenia kluczy obcy – dbałość o integralność danych – nie można
dodać żadnych wierszy, które nie mają odpowiedników w innej tabeli
ograniczenia kluczy obcych nie są konieczne – wymagają dużo zasobów, z
powodzeniem może je zastąpić logika PHP
punkty kontrolne odzyskiwania danych – wpis do pliku dziennika – w
przypadku załamania bazy lub systemu można odzyskać dane z tabeli
InnoDB
InnoDB (2):








elastyczna izolacja transakcji – model można rozluźnić by
przyspieszyć wykonywanie zapytań część właściwości transakcji
znika
elastyczne indeksowanie – automatyczna decyzja czy w tabeli
potrzebny jest szybki indeks mieszający
zajmują dużo więcej przestrzeni niż MyISAM
jeśli są klucze obce to trzeba na zarządzanie tabelami dużo więcej
zasobów
wersjonowanie danych i użycie transakcji – zarządzanie tabelami –
dużo więcej zasobów
większa ilość pamięci by panować nad blokadami wierszy
blokowanie może obniżyć wydajność – skoro jest na poziomie
wierszy –więcej trzeba ustanawiać i zdejmować blokad
indeksy zakładać gdy ładujemy dane do tabel, potem jest to bardzo
czasochłonne
Heap:









do specjalnych celów, mają ograniczenia
przechowywane w pamięci, nie na dysku
tabele tymczasowe, tabele z częstymi odwołaniami
ograniczenia – jak serwer zatrzyma się, ponowne uruchomienie, nie
ładują się
indeksowanie mieszające – najszybsze wyszukiwanie – dokładne
dopasowanie jako = i <=> inne porównania nie działają, nie działa
sortowanie ORDER BY – do znalezienia wiersza związanego z
wartością klucza
nie obsługują wszystkich typów – brak TEXT, BLOB, brak
mechanizmu AUTO_INCREMENT
trzymanie w pamięci – zasobochłonne – używać z umiarem, małe
„gabaryty”
blokady na poziomie całych tabel
jak padnie serwer to tabela przepada – jest tylko w pamięci!
Transakcje – COMMIT i ROLLBACK (1)




seria instrukcji SQL jako jedna niepodzielna grupa, działa tylko w
tabelach transakcyjnych (InnoDB)
transakcje = powtarzalne odczyty
domyślnie MySQL na automatyczne zatwierdzanie – aktualizacja danych
zaraz po wykonaniu modyfikacji
wyłączenie – poprzez ustawienie parametru bądź włączenie transakcji:
SET AUTOCOMMIT = 0;
START TRANSACTION;
SELECT * FROM tabela1 WHERE typ LIKE ”tutu”;
UPDATE tabela2 SET suma = 1 WHERE typ LIKE ”tutu”;
COMMIT;
SET AUTOCOMMIT = 1;
START TRANSACTION;
SELECT * FROM tabela1 WHERE typ LIKE ”tutu”;
UPDATE tabela2 SET suma = 1 WHERE typ LIKE ”tutu”;
ROLLBACK;
Transakcje – COMMIT i ROLLBACK (2)
BEGIN WORK;
SELECT * FROM tabela1 WHERE typ LIKE ”tutu”;
UPDATE tabela2 SET suma = 1 WHERE typ LIKE ”tutu”;
COMMIT;
BEGIN;
SELECT * FROM tabela1 WHERE typ LIKE ”tutu”;
UPDATE tabela2 SET suma = 1 WHERE typ LIKE ”tutu”;
ROLLBACK;


nie można cofnąć instrukcji, które tworzą i usuwają bazy danych, tworzą,
usuwają tabele – projektować tak transakcje by ich nie było w nich, inaczej
nie można cofnąć całej transakcji
niejawne zatwierdzenie robią:
ALTER TABLE
DROP DATABASE
LOAD MASTER TABLE
SET AUTOCOMMIT=1
UNLOCK TABLES
BEGIN
DROP INDEX
LOCK TABLES
START TRANSACTION
CREATE TABLE
CREATE INDEX
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
Transakcje – COMMIT i ROLLBACK (3)

wycofanie transakcji do punku kontrolnego:
SAVEPOINT identyfikator
ROLLBACK TO SAVEPOINT identyfikator






blokowanie tabel - LOCK TABLE – blokowanie tabeli dla potrzeb bieżącego
wątku, UNLOCK TABLES – zwalnia wszystkie blokady nałożone w danym
wątku, niejawne odblokowanie przy wykonaniu innej LOCK TABLES lub przy
zamknięciu połączenia z serwerem
LOCK TABLES niebezpieczna dla transakcji – zatwierdza aktywną transakcję
przed nałożeniem blokad
Użycie LOCK TABLES wymaga uprawnień do LOCK TABLES i SELECT,
wcześniejsze wersje MySQL: SELECT, INSERT, DELETE, UPDATE
blokada READ – tylko odczyt z tabeli, WRITE – wątek, który założył może
pisać, czytać, reszta wątków zablokowana
READ LOCAL – możliwe są niekonfliktowe INSERT-y
jeśli blokada z synonimem trzeba odwołać się z synonimem:
Transakcje – COMMIT i ROLLBACK (4)
LOCK TABLE t READ;
SELECT * FROM t AS synonim;
LOCK TABLE t AS synonim READ;
SELECT * FROM t;
SELECT * FROM t AS synonim;





WRITE ma wyższy priorytet od READ – jeśli nałożono READ i czeka WRITE
do nałożenia, to stawiane kolejne READ muszą czekać aż WRITE będzie
nałożona i zwolniona
LOW_PRIORITY WRITE – pozwala nałożyć READ chociaż czekamy na
rozstrzygnięcie z WRITE
LOCK TABLES: blokada do odczytu i zapisu, najpierw zapis, KILL pozwala
znieść oczekiwanie na założenie blokady
w MyISAM blokowanie przyspiesza wykonywanie wstawiania, aktualizacji,
usuwania, klucze są pamiętane w pamięci podręcznej, normalnie jest ona
czyszczona po każdym zapytaniu SQL-owym
zasadniczo nie ma potrzeby robienia blokad!
Transakcje – COMMIT i ROLLBACK (5)
LOCK TABLES trans READ, klienci WRITE;
SELECT SUM(value) FROM trans WHERE id_klienta == pewien_id;
UPDATE klienci
SET razem = suma_z_poprzednich_instrukcji
WHERE id_klienta == pewnie_id;
UNLOCK TABLES;


bez LOCK TABLES między SELECT a UPDATE inny wątek może
spowodować wstawienie nowego wiersza do tabeli trans
alternatywą do blokowania są operacje SET postaci:
UPDATE klienci SET wartosc = wartosc + nowa_wartosc

Podobne dokumenty