Bazy danych 9. Indeksowanie



Podobne dokumenty
Bazy danych 12. SQL Wyszukiwanie pełnotekstowe

Bazy danych 6. Klucze obce. P. F. Góra

Bazy danych 7. SQL podstawy

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Plan wykładu. Klucz wyszukiwania. Pojęcie indeksu BAZY DANYCH. Pojęcie indeksu - rodzaje indeksów Metody implementacji indeksów.

Bazy danych 10. SQL Widoki

Wykład 5. SQL praca z tabelami 2

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

Bazy danych 11. Algorytmy złaczeń. P. F. Góra

Bazy danych - BD. Indeksy. Wykład przygotował: Robert Wrembel. BD wykład 7 (1)

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Język SQL, zajęcia nr 1

Struktura drzewa w MySQL. Michał Tyszczenko

Podstawy Informatyki. Metody dostępu do danych

Bazy danych 5. Samozłaczenie SQL podstawy

Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste.

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew

Tadeusz Pankowski

Fizyczna struktura bazy danych w SQL Serwerze

Sortowanie bąbelkowe

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Wykład 4. SQL praca z tabelami 1

Indeksowanie w bazach danych

Bazy danych 4. SQL podstawy. P. F. Góra

ALGORYTMY I STRUKTURY DANYCH

Wykład 8. SQL praca z tabelami 5

Wykład 8. Drzewa AVL i 2-3-4

Bazy danych 9. SQL Klucze obce Transakcje

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Bazy danych 9. Klucze obce Transakcje. P. F. Góra

Autor: Joanna Karwowska

Bazy danych 9. Klucze obce Transakcje

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

Bazy danych. Andrzej Łachwa, UJ, /15

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

SQL (ang. Structured Query Language)

Podstawy technologii WWW

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

Wykład 05 Bazy danych

Wprowadzenie do baz danych

Definicja pliku kratowego

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Bazy danych i usługi sieciowe

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

Bazy danych 6. Podzapytania i grupowanie. P. F. Góra

Bazy danych wykład ósmy Indeksy

Optymalizacja poleceń SQL Metody dostępu do danych

Bazy Danych i Usługi Sieciowe

Bazy danych 11. Kilka przykładów. P. F. Góra

Sortowanie. Bartman Jacek Algorytmy i struktury

Przykładowe B+ drzewo

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

Język SQL Złączenia. Laboratorium. Akademia Morska w Gdyni

Internetowe bazy danych

Kurs. Podstawy MySQL

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Bazy danych. Dr inż. Paweł Kasprowski

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Paweł Rajba

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z

kończy wysyłanie danych do pliku tworzy strukturę tabeli wyświetla opis struktury tabeli zmiana nazwy tabeli usuwanie tabeli

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Język SQL, zajęcia nr 2

Bazy danych 7. Klucze obce Transakcje. P. F. Góra

Systemy GIS Tworzenie zapytań w bazach danych

Wykład 6. Drzewa poszukiwań binarnych (BST)

Bazy danych Język SQL część 1 Wykład dla studentów matem

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Bazy danych 8. Widoki i wyzwalacze. P. F. Góra

Wysokość drzewa Głębokość węzła

Bazy danych 6. SQL funkcje daty i czasu, zmienne tymczasowe, aliasy

Wstęp do metod numerycznych Eliminacja Gaussa Równania macierzowe. P. F. Góra

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Drzewa poszukiwań binarnych

Algorytmy i Struktury Danych

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Projektowanie systemów baz danych

SIECI KOMPUTEROWE I BAZY DANYCH

SIECI KOMPUTEROWE I BAZY DANYCH

Drzewa AVL definicje

Bazy danych 7. SQL dalsze możliwości. Grupowanie.

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Bazy danych. Polecenia SQL

Dr Michał Tanaś(

Drzewa czerwono-czarne.

Wykład 6. SQL praca z tabelami 3

Bazy danych Wykład zerowy. P. F. Góra

Transkrypt:

Bazy danych 9. Indeksowanie P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ 2011/12

Przeszukiwanie posortowanego pliku Wyszukanie wybranego wiersza w posortowanej tabeli o długości N wymaga dokonania O(log 2 N) porównań i, typowo, tyluż dostępów do dysku, co samo w sobie może być kosztowne. Jednak tabele SQL nie sa posortowane, a co za tym idzie, pliki, w których zapisywane sa tabele na dysku, też nie sa posortowane dotyczy to zwłaszcza tabel, w których dane sa często zmieniane (dodawane, usuwane, dodawane itd). Wymóg zapisywania za każdym razem posortowanej wersji pliku spowodowałby dramatyczne spowolnienie działania bazy. Dodatkowym problemem może być to, że często w tabelach definiujemy wiele porzadków : ta sama tabela mogłaby być sortowana w kolejności numerów operacji (klucz główny), nazwisk klientów (moga się powtarzać), daty operacji (moga się powtarzać) itp. Copyright c 2011-12 P. F. Góra 9 2

Dlatego też używa się indeksów, specjalnych struktur danych, przechowujacych tylko atrybuty, względem których sortujemy; atrybuty te nie musza być kluczami tabeli (mylaca terminologia). Milczaco zakładamy, że wraz z kluczem przechowywany jest fizyczny adres odpowiedniej krotki na dysku. Indeksy musza być tak zaprojektowane, aby wyszukiwanie elementów było szybkie, a dodawanie nowych i usuwanie istniejacych niezbyt skomplikowane. Copyright c 2011-12 P. F. Góra 9 3

b-drzewo (b-tree) Najczęściej używana struktura danych do indeksowania tabel SQL. Definicja: 1. Drzewo ukorzenione. 2. Każdy węzeł ma nie więcej, niż m potomków. 3. Każdy węzeł, poza korzeniem i liśćmi, ma nie mniej, niż m/2 potomków. m/2 jest zaokraglane w dół do liczby całkowitej i nazywane jest czynnikiem minimalizacji. 4. Korzeń, jeśli nie jest jednocześnie liściem, ma co najmniej dwóch potomków. 5. Wszystkie liście leża na tym samym poziomie. 6. Węzeł nie będacy liściem, posiadajacy k potomków, zawiera k 1 kluczy. 7. Węzeł posiada nie więcej, niż m 1 kluczy. Liść, który nie jest korzeniem, posiada nie mniej, niż (m/2) 1 kluczy. Copyright c 2011-12 P. F. Góra 9 4

Klucze przechowywane sa w porzadku niemalejacym. Każdy klucz (w węźle niebędacym liściem) ma potomka, który jest korzeniem poddrzewa zawierajacego węzły z kluczami mniejszymi lub równymi od tego klucza, ale większymi od poprzedniego klucza; innymi słowy, klucze przechowywane w węzłach wewnętrznych działaja jak separatory. Każdy węzeł ma ponadto dodatkowego potomka, umiejscowionego skrajnie po prawej stronie, będacego korzeniem poddrzewa zawierajacego klucze większe od wszystkich kluczy w danym węźle. B-drzewa wymyślili Rudolf Bayer i Ed McCreight w 1972, pracujacy wówczas dla Boeinga. Nie wiedomo, co tak naprawdę oznacza b w nazwie b-drzewa. Może to być Bayer, Boeing, broad (szerokie), bushy (krzaczaste), balanced (zrównoważone) lub jeszcze coś innego. Copyright c 2011-12 P. F. Góra 9 5

Przykład b-drzewa Copyright c 2011-12 P. F. Góra 9 6

Własności b-drzew B-drzewo o czynniku minimalizacji m/2, przechowujace N węzłów, ma wysokość N + 1 h < log m/2. 2 W praktycznych implementacjach m bywa duże (rzędu kilkuset). Podstawa logarytmu jest duża, a w konsekwencji b-drzewo jest szerokie, ale niskie. Jeśli m/2 = 100, drzewo o dwu poziomach może przechować 10 000 kluczy, drzewo o trzech poziomach 1 000 000 kluczy. Liczba węzłow odwiedzanych w czasie przeszukiwania jest niewielka, rzędu 2-3 tyle też trzeba wykonać odczytów danych z dysku, plus jeden na odczytanie poszukiwanej krotki, minus jeden, gdyż korzenie indeksów często używanych tabel zazwyczaj rezyduja w pamięci. Copyright c 2011-12 P. F. Góra 9 7

Budujac drzewo węzły pozostawia się nie wpełni wypełnione, gdyż ułatwia (przyspiesza) to późniejsze wstawianie nowych kluczy (patrz niżej). Wyjatek stanowia tabele statyczne, niezmieniajace się w czasie (lub zmieniajace się bardzo rzadko) w tej sytuacji wypełniamy węzły wewnętrze do ich maksymalnej pojemności. Copyright c 2011-12 P. F. Góra 9 8

Wyszukiwanie w b-drzewie Przeszukiwanie rozpoczynamy od korzenia. Każdy węzeł przeszukujemy przegladaj ac kolejne klucze. Gdy znajdziemy wartość większa lub równa wartości poszukiwanej, wiemy, że poszukiwana wartość (poszukiwane wartości) znajduja się w poddrzewie, którego korzeniem jest znaleziona wartość (znaleziony separator). Jeśli wszystkie klucze w węźle sa większe od wartości poszukiwanej, znajduje się ona w skrajnie prawym poddrzewie. Przeszukiwanie możemy zakończyć bez schodzenia do poziomu liści, jeśli poszukiwana wartość jest kluczem w jakimś węźle wewnętrznym. Czas przeszukiwania b-drzewa jest O(log m/2 N). Copyright c 2011-12 P. F. Góra 9 9

Podział węzła Jeśli węzeł staje się przepełniony (po wstawieniu nowego klucza miałby więcej, niż m 1 kluczy), trzeba go podzielić. Niech X oznacza dzielony węzeł, Y jego rodzica. Medianę węzła X wstawiamy do jego rodzica, Y. Tworzymy nowy węzeł, Z, i wstawiamy do niego te klucze z X, które sa większe od mediany. Z X usuwamy medianę i wartości większe od niej. Jeżeli dzielony węzeł nie jest liściem, wraz z przenoszonymi kluczami trzeba też przenieść wskaźniki do odpowiednich poddrzew. Cały ten proces niesie stały koszt O(m). W procesie podziału węzła, w tym w obliczaniu mediany, bierze też udział klucz, który chcemy wstawić do węzła (jeśli faktycznie chcemy wstawić). Uwaga! Wstawianie mediany X do rodzica może spowodować przepełnienie rodzica, którego wówczas także dzielimy. Copyright c 2011-12 P. F. Góra 9 10

Wstawianie klucza do b-drzewa Zanim wstawimy klucz, trzeba odszukać (za pomoca podanego wyżej algorytmu) liść, w którym ten klucz powinien się znaleźć. Jeżeli liść nie jest pełny, po prostu wstawiamy nowy klucz. Jeżeli liść jest pełny, należy go podzielić w sposób opisany powyżej. Ponieważ podział oznacza przesunięcie mediany dzielonego węzła na wyższy poziom, rodzic nie może być pełny lub też trzeba podzielić rodzica. Ten proces może powtarzać się w górę drzewa, aż do korzenia. Jeżeli korzeń się przepełnia, dzielimy go, tworzac nowy korzeń, na wyższym poziomie. Po takim podziale korzenia nowy korzeń zawiera tylko jeden klucz (medianę kluczy starego korzenia) i ma dwóch potomków. Algorytm wstawiania kluczy do b-drzewa niesie koszt O(m log m/2 N). Copyright c 2011-12 P. F. Góra 9 11

Ten algorytm wymaga dwóch przejść przez drzewo: Pierwszego, w dół, w celu znalezienia liścia, do którego miałby trafić wstawiany element i drugiego, w górę, w celu dokonania podziału przodków. Ponieważ każde odczytanie węzła może oznaczać kosztowna operację dyskowa, powyższy algorytm modyfikujemy w ten sposób, aby uniknać drugiego przejścia przez drzewo. Mianowicie, już na etapie poszukiwania (pierwsze przejście) dzielimy każdy napotkany maksymalnie wypełniony węzeł. Może to oznaczać wykonywanie niepotrzebnych podziałów, ale gwarantuje, że po wstawieniu nowego klucza do liścia rodzic nie będzie przepełniony, co eliminuje konieczność ponownego przejścia drzewa w górę. Copyright c 2011-12 P. F. Góra 9 12

Usuwanie kluczy z b-drzewa Usuwanie jest bardziej skomplikowane, niż wstawianie, gdyż trzeba zadbać, aby powstałe drzewo nadal było b-drzewem. Przypadki wymagajace specjalnej troski to Usunięcie klucza powoduje, że węzeł ma mniej niż minimalna liczbę kluczy i dzieci. Usuwany klucz leży w węźle wewnętrznym, a zatem jest separatorem drzew potomnych. Po usunięciu klucza z drzewa, drzewo często należy zrównoważyć. Copyright c 2011-12 P. F. Góra 9 13

Usuwanie z liścia 1. Odszukaj klucz, który chcesz usunać. 2. Jeśli klucz należy do liścia, usuń go. 3. Jeśli w wyniku usunięcia pojawia się niedopełnienie, sprawdź rodzeństwo (najbliższych sasiadów) węzła i albo przenieś klucz, albo połacz sasiednie węzły. 4. Jeśli usunęliśmy wartość ze skrajnie prawego węzła (pod)drzewa, przenieś do niego największa wartość z jego lewego sasiada, jeśli nie spowoduje to niedopełnienia. 5. Jeśli usunęliśmy wartość ze skrajnie lewego węzła (pod)drzewa, przenieś do niego najmniejsza wartość z jego prawego sasiada, jeśli nie spowoduje to niedopełnienia. Copyright c 2011-12 P. F. Góra 9 14

Usuwanie z węzła wewnętrznego Każdy klucz w węźle wewnętrznym (i w korzeniu) jest separatorem dwu poddrzew. Jeśli taki element zostaje usunięty, moga zdarzyć się dwie sytuacje: Po pierwsze, każde z dwojga dzieci bezpośrednio na lewo i na prawo od usuwanego elementu ma minimalna dopuszczalna liczbę kluczy, (m/2) 1. Węzły te moga być połaczone w jeden, posiadajacy 2(m/2) 2 kluczy, co nie przekracza największej dopuszczalnej liczby kluczy. Węzeł ten zostaje przypisany do któregoś z sasiednich (nieusuniętych) kluczy. Pewna komplikacja może pojawić się, jeżeli klucze nie sa unikalne i klucze o wartościach równych usuwanemu występuja w łaczonych węzłach. Trzeba je także rekursywnie usunać. Dodatkowa trudność powstaje, jeżeli w wyniku takiego rekursywnego usuwania liczba kluczy w połaczonym węźle potomnym spadnie poniżej (m/2) 1. Copyright c 2011-12 P. F. Góra 9 15

Po drugie, co najmniej jedno z dwu dzieci posiada więcej, niż najmniejsza dopuszczalna liczbę kluczy. Wówczas trzeba dla tych węzłów znaleźć nowy separator. Może nim być największy element w lewym poddrzewie lub najmniejszy element w prawym poddrzewie. Element ten usuwamy z węzła, do którego należał i przemieszczamy do węzła, z którego usunęliśmy ten element, od usunięcia którego to wszystko się zaczęło. Ponieważ kreujac nowy separator usunęliśmy element z węzła niższego rzędu (na ogół z liścia, choć może to być węzeł wewnętrzny niższego poziomu), trzeba teraz zastosować odpowiedni algorytm (usunięcie z liścia, usunięcie z węzła wewnętrznego) do tego węzła. Copyright c 2011-12 P. F. Góra 9 16

Równoważenie drzewa po usunięciu Problemy pojawiaja się, jeśli w wyniku usuwania liczba kluczy w którymś węźle spadnie poniżej dopuszczalnego minimum. Uwaga: Ograniczenie na najmniejsza dopuszczalna liczbę kluczy nie dotyczy korzenia, który może zawierać tylko jeden klucz! 1. Jeśli prawy brat węzła z niedoborem ma więcej, niż najmniejsza dopuszczalna liczbę kluczy, (a) Przenieś separator z rodzica do węzła z niedoborem, umieszczajac go w ostatniej pozycji. (b) Najmniejszy element z prawego brata uczyń nowym separatorem i przenieś do rodzica. (c) Jeśli przekształcane węzły nie sa liśćmi, przenieś pierwszego (skrajnie lewego) potomka prawego brata do węzła, w którym występował niedobór i uczyń go jego ostatnim (skrajnie prawym) dzieckiem. Copyright c 2011-12 P. F. Góra 9 17

2. Jeśli nie zachodzi powyższy przypadek, a lewy brat węzła z niedoborem ma więcej, niż najmniejsza dopuszczalna liczbę kluczy, (a) Przenieś separator z rodzica do węzła z niedoborem, umieszczajac go na pierwszej pozycji. (b) Największy element z lewego brata uczyń nowym separatorem i przenieś do rodzica. (c) Jeśli przekształcane węzły nie sa liśćmi, przenieś ostatniego (skrajnie prawego) potomka lewego brata do węzła, w którym występował niedobór i uczyń go jego pierwszym (skrajnie lewym) dzieckiem. Copyright c 2011-12 P. F. Góra 9 18

3. Jeśli lewy i prawy brat maja najmniejsza dopuszczalna liczbę kluczy, (a) Stwórz nowy węzeł zawierajacy klucze z węzła z niedoborem, klucze z jednego z braci oraz separatora (z rodzica), który rozdzielał łaczone węzły. (b) Usuń separator z rodzica i zastap dwoje dzieci, które rozdzielał, połaczo- nym węzłem stworzonym w powyższym kroku. (c) Jeśli usunięcie separatora z rodzica spowodowało, że liczba kluczy rodzica spadła poniżej minimum i jeśli rodzic nie jest korzeniem, powtórz cały algorytm równoważenia dla rodzica. Jedynym przypadkiem, jaki pozostaje, jest korzeń, który nie zawiera kluczy i ma jednego potomka. W tym wypadku usuwamy (pusty) korzeń. Nowym korzeniem staje się jego jedyny potomek. Copyright c 2011-12 P. F. Góra 9 19

Indeksy w SQL Klucz główny zawsze jest indeksem: mysql> CREATE TABLE foo -> (KolA INT NOT NULL PRIMARY KEY, ->...); Query OK, 0 rows affected (0.02 sec) Torzenie klucza głównego na więcej, niż jednej kolumnie wszystkie musza być NOT NULL: mysql> CREATE TABLE bar -> (Kol1 CHAR(5) NOT NULL, -> Kol2 INT NOT NULL, -> KOL3 CHAR(12), -> PRIMARY KEY(Kol1,Kol2)); Query OK, 0 rows affected (0.09 sec) Copyright c 2011-12 P. F. Góra 9 20

Dodatkowe indeksy Dodatkowe indeksy możemy tworzyć od razu w definicji tabeli... mysql> CREATE TABLE popo -> (X INT NOT NULL PRIMARY KEY, -> Y VARCHAR(16), -> INDEX tojestnazwa (Y)); Query OK, 0 rows affected (0.08 sec) Copyright c 2011-12 P. F. Góra 9 21

...albo osobno, poleceniem CREATE INDEX nazwaindeksu ON nazwatabeli (kolumna): mysql> CREATE TABLE lupo -> (nr INT UNSIGNED NOT NULL PRIMARY KEY, -> A VARCHAR(16), -> B DATE); Query OK, 0 rows affected (0.19 sec) mysql> CREATE INDEX indeksnadwukolumnach ON lupo (A,B); Query OK, 0 rows affected (0.27 sec) Records: 0 Duplicates: 0 Warnings: 0 Nazwa indeksu jest opcjonalna. Jest ona potrzebna, jeżeli chcemy explicite zażadać użycia (lub zignorowania) jakiegoś indeksu. Indeks może mieć kwalifikator UNIQUE (CREATE UNIQUE INDEX...). Wartości atrybutu wchodzacego w skład indeksu unikalnego nie moga się powtarzać. W MySQL kolumna wchodzaca w skład unikalnego indeksu może przyjmować wartości NULL, które moga się powtarzać. Copyright c 2011-12 P. F. Góra 9 22

Przykład bigdata jest tabela zawierajac a 2 000 000 krotek. Zawiera trzy kolumny, z których pierwsza, będaca kluczem głównym, jest typu INTEGER, druga TIMESTAMP, trzecia BIGINT. Zakładamy dodatkowe indeksy na tych dwu kolumnach. mysql> CREATE INDEX indeksczasu ON bigdata (czas); Query OK, 2000000 rows affected (9 min 45.19 sec) Records: 2000000 Duplicates: 0 Warnings: 0 mysql> CREATE INDEX indeksliczb ON bigdata (wielkosc); Query OK, 2000000 rows affected (35 min 21.59 sec) Records: 2000000 Duplicates: 0 Warnings: 0 Proszę zwócić uwagę na czasy wykonania zapytań zakładajacych te indeksy! Copyright c 2011-12 P. F. Góra 9 23

Zrómy kopię tej tabeli, nie zawierajac a nowych indeksów: mysql> CREATE TABLE bezindeksow -> (nr INT UNSIGNED NOT NULL PRIMARY KEY, -> czas TIMESTAMP NOT NULL, -> wielkosc BIGINT UNSIGNED NOT NULL) -> SELECT * FROM bigdata; Query OK, 2000000 rows affected (36.55 sec) Records: 2000000 Duplicates: 0 Warnings: 0 Copyright c 2011-12 P. F. Góra 9 24

Traz porównajmy czasy wykonania dwu zapytań: mysql> SELECT COUNT(DISTINCT wielkosc) -> FROM bigdata USE INDEX (indeksliczb) -> WHERE wielkosc < 16000000; +--------------------------+ COUNT(DISTINCT wielkosc) +--------------------------+ 96 +--------------------------+ 1 row in set (0.24 sec) mysql> SELECT COUNT(DISTINCT wielkosc) -> FROM bezindeksow -> WHERE wielkosc < 16000000; +--------------------------+ COUNT(DISTINCT wielkosc) +--------------------------+ 96 +--------------------------+ 1 row in set (3.34 sec) Copyright c 2011-12 P. F. Góra 9 25

Uwagi o wykorzystaniu indeksów Efektywność wykorzystania indeksów zależy od selektywności zapytania, to jest od tego, jak duży procent wierszy przeszukiwanej tabeli zwraca zapytanie. I tak: Jeżeli zapytanie zwraca nie więcej, niż 1% wierszy, warto używać indeksów. Jeżeli zapytanie zwraca więcej, niż 20% wierszy, nie należy używać indeksów. Strategia pełnego odczytu danych z tabeli będzie bardziej efektywna. To, co się dzieje dla wartości pośrednich, może zależeć od wielu czynników, w tym historii usuwania i dodawania nowych wierszy do tabeli, a nawet historii odczytywań danych z tabeli przez bieżacy watek kliencki. Jak widzeliśmy, samo zakładanie indeksów na wielkich tabelach może być kosztowne. Dodatkowo każdy indeks powoduje, że proces dodawania/usuwania krotek z tabeli może być znacznie wolniejszy. Indeksów nie należy więc zakładać bo tak, ale tylko wówczas, gdy ich przewidywane wykorzystanie przyspieszy działanie bazy, to znaczy działanie często wykonywanych/kluczowych zapytań. Copyright c 2011-12 P. F. Góra 9 26

Wymuszanie indeksów W większości przypadków wbudowany optymalizator zapytań sam zdecyduje, jaki plan wykonania wybrać, jakich indeksów użyć, czy nie lepsza będzie strategia pełnego przegladania tabeli itp. W sytuacjach, w których podejrzewamy, że optymalizator nie znajduje właściwego rozwiazania, możemy narzucić to, z jakiego indeksu skorzystać SELECT... FROM nazwatabeli USE INDEX(nazwaindeksu)...; spowoduje, że wyszukiwanie będzie odbywać się z wykorzystaniem wskazanego indeksu. SELECT... FROM nazwatabeli FORCE INDEX(nazwaindeksu)...; spowoduje, że wyszukiwanie będzie odbywać się z wykorzystaniem wskazanego indeksu, przy czym dodatkowo optymalizator uzna, że pełne przegladanie tabeli jest bardzo kosztowne, a więc nie wolno go zastować. SELECT... FROM nazwatabeli IGNORE INDEX(nazwaindeksu)...; spowoduje, że wskazany indeks nie zostanie użyty. Analogicznej składni można używać w złaczeniach. Copyright c 2011-12 P. F. Góra 9 27

Indeksy i zapytanie UPDATE Przypuśćmy, że w zapytaniu UPDATE zmieniamy wartości indeksowanego atrybutu, przy czym zmianom podlega niewiele elementów, tak, aby wyszukiwanie odbywało się z użyciem indeksu, nie w trybie pełnego przegladania tabeli. Na przykład chcemy podnieść o 10% pensje pracownikom zarabiajacym najmniej: UPDATE pracownicy SET pensja = 1.1*pensja WHERE pensja < 2000; Jeśli kolumna pensja jest indeksowana, narzucajacy się sposób wykonania jest taki: 1. Wyszukaj element spełniajacy warunek WHERE. 2. Zmień jego wartość. 3. Wyszukaj kolejny element etc Copyright c 2011-12 P. F. Góra 9 28

Rodzi się tu jednak pewne niebezpieczeństwo: Zmieniona wartość może nadal spełniać kryterium (wyobraźmy sobie kogoś zarabiajacego 1500 PLN), zaś po dokonaniu zmiany zostanie przebudowany indeks i nowa wartość może zostać znaleziona przy przeszukiwaniu indeksu jako kandydat do zmiany. To byłoby wbrew naszym intencjom! Zapytanie SQL nie może widzieć wprowadzanych przez siebie zmian. Copyright c 2011-12 P. F. Góra 9 29

UPDATE z wykorzystaniem indeksu odbywa się zatem następujaco: I. W pierwszej fazie, korzystajac z indeksu, tylko wyszukujemy krotki, które należy zmienić, i zapamiętujemy ich klucze w tabeli pomocniczej. Ponieważ zmienianych krotek nie będzie zbyt wiele, zmaterializowana tabela pomocnicza najprawdopodobniej zmieści się w pamięci. II. W drugiej fazie, przegladamy tabelę z kluczami krotek, które trzeba zmienić, i korzystajac z indeksu zwiazanego z kluczem głownym, znajdujemy odpowiednie krotki i dokonujemy zmiany wartości w krotce. Po każdej zmianie następuje przebudowanie indeksu, ale nie jest on już przeszukiwany w tym samym zapytaniu. Copyright c 2011-12 P. F. Góra 9 30

Wyszukiwanie pełnotekstowe Wyszukiwanie pełnotekstowe służy do wyszukiwania podanych napisów (ciagów znaków) w kolumnach typu CHAR, VARCHAR, TEXT. W tym celu na tabeli, która chcemy w ten sposób przeszukiwać, należy założyć specjalny indeks. W MySQL wyszukiwanie pełnotekstowe działa tylko na tabelach typu MyISAM. mysql> CREATE TABLE Teksty -> (Id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -> Tytul VARCHAR(32), -> Tresc VARCHAR(64), -> FULLTEXT(Tytul,Tresc) -> ) ENGINE=MyISAM, CHARSET cp1250; Query OK, 0 rows affected (0.28 sec) Copyright c 2011-12 P. F. Góra 9 31

Niech przykładowa tabela zawiera następujace dane: mysql> SELECT * FROM Teksty; +----+----------------------+-------------------------------------------------------+ Id Tytul Tresc +----+----------------------+-------------------------------------------------------+ 1 Prof. Andrzej bim Rzepliński, bom, kryminolog: - Nie znam akt 2 operacyjnych bim bom gdzie mogą być dowody, ale nie możemy 3 wykluczyć, że XXX bim był milicyjnym agentem. 4 Powtórka Operacyjnych akt nie znam ja, bim, mówi Rzepliński. 5 Bim Operacyjnych, operacyjnych, operacyjnych, milicyjych. 6 Bim bim akt operacyjnych 7 Bom bim 8 wypełniacz wypełniacz 9 bim wypełniacz 10 wypełniacz bim +----+----------------------+-------------------------------------------------------+ 10 rows in set (0.10 sec) Copyright c 2011-12 P. F. Góra 9 32

Wyszukiwanie odbywa się poprzez wywołanie zapytania SELECT z klauzula WHERE MATCH(nazwy kolumn) AGAINST(wzorzec). mysql> SELECT * FROM TEKSTY -> WHERE MATCH (Tytul,Tresc) AGAINST( operacyjnych ); +----+----------------------+--------------------------------------------------------+ Id Tytul Tresc +----+----------------------+--------------------------------------------------------+ 5 Bim Operacyjnych, operacyjnych, operacyjnych, milicyjnych. 6 Bim bim akt operacyjnych 4 Powtórka Operacyjnych akt nie znam ja, bim, mówi Rzepliński. 2 operacyjnych bim bom gdzie mogą być dowody, ale nie możemy +----+----------------------+--------------------------------------------------------+ 4 rows in set (0.00 sec) Copyright c 2011-12 P. F. Góra 9 33

Wartość semantyczna Wyrażenie MATCH...AGAINST(wzorzec) określa wartość semantyczna podanego wzorca w poszczególnych wierszach tabeli: mysql> SELECT Id, CONCAT(Tytul,,Tresc) AS Tekst, -> MATCH (Tytul,Tresc) AGAINST( operacyjnych ) AS Wartosc -> FROM Teksty; +----+---------------------------------------------------------------+------------------+ Id Tekst Wartosc +----+---------------------------------------------------------------+------------------+ 1 Prof. Andrzej bim Rzepliński, bom, kryminolog: - Nie znam akt 0 2 operacyjnych bim bom gdzie mogą być dowody, ale nie możemy 0.38341854994499 3 wykluczyć, że XXX bim był milicyjnym agentem. 0 4 Powtórka Operacyjnych akt nie znam ja, bim, mówi Rzepliński. 0.38763393589171 5 Bim Operacyjnych, operacyjnych, operacyjnych, milicyjnych. 0.53687456835829 6 Bim bim akt operacyjnych 0.40085528270084 7 Bom bim 0 8 wypełniacz wypełniacz 0 9 bim wypełniacz 0 10 wypełniacz bim 0 +----+---------------------------------------------------------------+------------------+ 10 rows in set (0.00 sec) Copyright c 2011-12 P. F. Góra 9 34

Wartość semantyczna wzorca w wierszu jest tym większa, im więcej razy wzorzec występuje w wierszu, jest tym większa, im wiersz jest krótszy, przyjmuje wartość zero, jeśli wzorzec nie występuje w wierszu. Uwaga: Wartość semantyczna wyrazów krótkich lub występujacych w co najmniej połowie wierszy wynosi zero. mysql> SELECT * FROM TEKSTY -> WHERE MATCH (Tytul,Tresc) AGAINST( bim bom ); Empty set (0.00 sec) Zapytanie SELECT... WHERE MATCH... AGAINST... wyświetla tylko wiersze o niezerowej wartości semantycznej. Copyright c 2011-12 P. F. Góra 9 35

Boolowskie wyszukiwanie pełnotekstowe AGAINST(wzorzec IN BOOLEAN MODE) pozwala na stosowanie operatorów lepiej określajacych poszukiwany wzorzec. Przy wyszukiwaniu boolowskim tabela nie musi mieć zdefiniowanego indeksu FULLTEXT. + fragment musi być obecny, fragment nie może być obecny. mysql> SELECT * FROM TEKSTY -> WHERE MATCH (Tytul,Tresc) AGAINST( +operacyjnych -znam IN BOOLEAN MODE); +----+----------------------+--------------------------------------------------------+ Id Tytul Tresc +----+----------------------+--------------------------------------------------------+ 2 operacyjnych bim bom gdzie mogą być dowody, ale nie możemy 5 Bim Operacyjnych, operacyjnych, operacyjnych, milicyjnych. 6 Bim bim akt operacyjnych +----+----------------------+--------------------------------------------------------+ 3 rows in set (0.04 sec) Brak operatora podany fragment jest opcjonalny. Wiersze zawierajace fragment opcjonalny sa oceniane wyżej. Copyright c 2011-12 P. F. Góra 9 36

() nawiasy służa do grupowania słów w podwyrażenia. Takie grupy można zagnieżdżać. " zwrot ujęty w podwójne cudzysłowy powoduje dopasowanie tylko wierszy, które zawieraja podany zwrot dokładnie w tej formie, w jakiej został napisany. Sa także inne operatory. Copyright c 2011-12 P. F. Góra 9 37

mysql> SELECT * FROM Teksty -> WHERE MATCH(Tytul,Tresc) AGAINST( +(akt operacyjnych) IN BOOLEAN MODE); +----+----------------------+--------------------------------------------------------+ Id Tytul Tresc +----+----------------------+--------------------------------------------------------+ 2 operacyjnych bim bom gdzie mogą być dowody, ale nie możemy 4 Powtórka Operacyjnych akt nie znam ja, bim, mówi Rzepliński. 5 Bim Operacyjnych, operacyjnych, operacyjnych, milicyjnych. 6 Bim bim akt operacyjnych +----+----------------------+--------------------------------------------------------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM Teksty -> WHERE MATCH(Tytul,Tresc) AGAINST( +"akt operacyjnych" IN BOOLEAN MODE); +----+---------+------------------+ Id Tytul Tresc +----+---------+------------------+ 6 Bim bim akt operacyjnych +----+---------+------------------+ 1 row in set (0.00 sec) Copyright c 2011-12 P. F. Góra 9 38

Wyszukiwanie z rozwijaniem zapytania Użytkownik bardzo często polega na wiedzy niejawnej człowiek wie, że jakieś terminy sa równoznaczne lub bliskoznaczne, ale jak to zalgorytmizować? Powiedzmy, szukajac wzorca daza danych, chcemy też uzyskać wiersze zawierajace napisy Oracle i MySQL, nawet jeśli napis baza danych w nich nie występuje. Albo też szukajac informacji o profesorze, chcemy tekże znaleźć wiersze, w których profesor wymieniony jest z nazwiska, z pominięciem tytułu. Realizujemy to za pomoca konstrukcji AGAINST(wzorzec WITH QUERY EXPANSION). W takim wypadku tabela przeszukiwana jest dwa razy. Przy drugim wyszukiwaniu wzorzec zostaje połaczony z kilkoma innymi wzorcami, znajdujacymi w wierszach będacych na górze (majacych największa wartość semantyczna pierwotnego wzorca) po pierwszym wyszukiwaniu. Copyright c 2011-12 P. F. Góra 9 39

Przykład mysql> SELECT * FROM TEKSTY -> WHERE MATCH (Tytul,Tresc) AGAINST( Prof ); +----+-------------------+---------------------------------------------+ Id Tytul Tresc +----+-------------------+---------------------------------------------+ 1 Prof. Andrzej bim Rzepliński, bom, kryminolog: - Nie znam akt +----+-------------------+---------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM TEKSTY -> WHERE MATCH (Tytul,Tresc) AGAINST( Prof WITH QUERY EXPANSION); +----+-------------------+-----------------------------------------------------+ Id Tytul Tresc +----+-------------------+-----------------------------------------------------+ 1 Prof. Andrzej bim Rzepliński, bom, kryminolog: - Nie znam akt 4 Powtórka Operacyjnych akt nie znam ja, bim, mówi Rzepliński. +----+-------------------+-----------------------------------------------------+ 2 rows in set (0.01 sec) Copyright c 2011-12 P. F. Góra 9 40

Uwagi końcowe Wyszukiwanie pełnotekstowe jest wolne i kosztowne. Jeżeli planujemy przeszukiwać naprawdę duża tabelę, zaleca się Utworzyć tabelę bez definiowania indeksu FULLTEX. Wprowadzić dane do tabeli. Po wprowadzeniu danych odać indeks za pomoca polecenia ALTER TABLE. W przeciwnym wypadku wprowadzanie danych do tabeli może być bardzo powolne. Istnieje sporo komercyjnych nakładek na RDBMSy, znacznie usprawniaja- cych wyszukiwanie pełnotekstowe. Copyright c 2011-12 P. F. Góra 9 41