Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: prosze o wyjasnienie działania indeksów
Forum PHP.pl > Forum > Bazy danych > MySQL
michat34
witam, jestem w kursie mysql na rodziale poswieconym indeksom. na poczatku rozumialem o co chodzi, sluza do grupowania rekordow pod jakims kryterium zeby ulatwic dostep. ale im dalej sie zaglebialem to mniej rozumialem, przeczytalem kilka razy szukalem jakis innych kursow ale nie łapie tego do konca. czy ktos komu sie chce moglby mi objasnic ich działanie, uzycie i uzytecznosc? zawsze łatwiej jak moge zadac jakies pytania niz tylko tresc z kursu. pozdrawiam
nospor
Co do samych indeksów to tu nie ma żadnej filozofii zbytnio:
indeksy służą do szybszego wyszukiwania danych.
michat34
to wiem, ale jakie jest ich praktyczne wykorzystanie? czy np dzieki temu moge wykorzystac dane z jednej tabeli w drugiej?
nospor
Praktyczne wykorzystanie?
Weź stwórz tabelę a w niej MILION rekordów. Następne wyszukuj jakiś danych w tej tabeli. Zajmie ci to dużo czasu.
A teraz zalóż indeks na pole po którym szukasz i ponów wyszukiwanie. Będzie to zrobione migiem.

Cytat
czy np dzieki temu moge wykorzystac dane z jednej tabeli w drugiej?
Jedno nie ma związku z drugim.
Powtarzam: indeksy same w sobie służą do przyspieszenia wyszukiwania informacji.
Możesz wiązać dane z różnych tabel ze sobą z indeksami czy bez nich. Ino że z indeksami będzie to szybsze.
maly_swd
Indexy to taki spis tresci.

Wez np duza ksiazke 1000stron i teraz aby odszukac konkretny rozdzial... bez spisu musialbys przegladac kazda storne i szukac. A dzieki indexowi wiesz ze aby odszukac kokretny rozdzial nalezy go szukac na 732 stronie.

I tak wlasnie dziala index, "baza" wie gdzie ma co zapisane.

Indexy moga pelnic jeszcze jedna wazna role, moga byc UNIKALNE, czyli nie bedzie mozliwe stworzenie wiecej niz jednego takiego samego "wpisu".
michat34
hmm ok. w kursie jest taki przykalad zastosowania indeksow:

  1. CREATE TABLE `kategorie` (
  2. `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  3. `nazwa` VARCHAR(40) NOT NULL,
  4. `il_ksiazek` mediumint(9) DEFAULT NULL,
  5. PRIMARY KEY (`id`),
  6. KEY `il_ksiazek` (`il_ksiazek`)
  7. ) ENGINE=InnoDB;
  8.  
  9. INSERT INTO `kategorie` VALUES (1, 'Literatura polska', 4);
  10. INSERT INTO `kategorie` VALUES (2, 'Literatura zagraniczna', 2);
  11.  
  12. CREATE TABLE `ksiazki` (
  13. `id` INT(11) NOT NULL AUTO_INCREMENT,
  14. `nazwa` VARCHAR(100) NOT NULL,
  15. `wydawnictwo` VARCHAR(50) NOT NULL,
  16. `cena` FLOAT NOT NULL DEFAULT '0',
  17. `kategoria_id` mediumint(9) NOT NULL,
  18. PRIMARY KEY (`id`),
  19. KEY `kategoria_id` (`kategoria_id`)
  20. ) ENGINE=InnoDB;
  21.  
  22. INSERT INTO `ksiazki` VALUES (1, 'Hamlet', 'AAA', 6.5, 2);
  23. INSERT INTO `ksiazki` VALUES (2, 'Makbet', 'AAA', 6.8, 2);
  24. INSERT INTO `ksiazki` VALUES (3, 'Potop', 'BBB', 18.4, 1);
  25. INSERT INTO `ksiazki` VALUES (4, 'Quo vadis', 'BBB', 17.99, 1);
  26. INSERT INTO `ksiazki` VALUES (5, 'Pan Tadeusz', 'CCC', 13.78, 1);
  27. INSERT INTO `ksiazki` VALUES (6, 'Nad Niemnem', 'CCC', 15.45, 1);


moglbys mi wytłumaczyc jaka funkcje pełni tutaj ten indeks? do czego sie odwołuje? i jak działa?
nospor
....

KEY `il_ksiazek` (`il_ksiazek`)
Przyspiesza wyszukiwanie/sortowanie po ilości książek

KEY `kategoria_id` (`kategoria_id`)
Przyspiesza łączenie tabeli ksiązki z tabelą kategorie

No przecież juz ci to mówiłem - przyspiesza.
michat34
to chyba sie probowalem doszukac jakis glbeszych tresci w Twojej wypowiedzi tongue.gif ale rozumiem, zwykłe przyspieszanie. przyklad ze spisem tresci tez był pomocny, dziekuje wink.gif mozna zamknac
alegorn
można ując inaczej: indexy ułatwiają życie (bazie danych)


czasem są wykorzystywane do przyspieszenia wyszukiwania danych, a czasem do zapewnienia spójności danych (index typu primary, unique, forgin key)

te drugie, przede wszystkim zapewniają integralność danych. w kolejnym kroku optymalizują (przyśpieszają)

w mysql w silniku myisam są jeszcze klucze ułatwia przeszukiwanie zawartości tekstowych (full search text)

j.
viking
Tylko kilka uwag.
Indeksy poprawnie nałożone przyśpieszają bo można wywołać skutek odwrotny.
Indeksy działają dla zapytań SELECT, dla innych operacji mogą spowodować zwolnienie (konieczność przebudowania indeksu)
Indeksy zabierają miejsce więc dla dużych tabel (wiele milionów rekordów) to będą spore wartości.
sazian
Witam,
działanie indeksów można bardzo łatwo zaobserwować przy pomocy EXPLAIN
prosty przykład
mam tablicę "test" w której jest 424 rekordów
chcemy pobrać rekord o id=1

zapytanie bez indeksów

Kod
EXPLAIN SELECT * FROM `test` WHERE id =1;

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL |  424 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+


jak widać mysql musiał przeszukać wszystkie 424 rekordy(informacja w kolumnie rows) rekordy żeby wyszukać ten o id=1

test drugi
robimy dokładnie to samo ale najpierw nakładamy indeks

Kod
ALTER TABLE `test` ADD INDEX `id` ( `ID` );

EXPLAIN SELECT * FROM `test` WHERE id =1;
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
|  1 | SIMPLE      | test  | ref  | id            | id   | 8       | const |    1 |       |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+

teraz mysql przeszukał tylko jeden rekord i użył do tego klucza o nazwie "id"
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.