Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wydajność MySQL:Indeksy MySQL/MariaDB

Dane w bazie danych MySQL/MariaDB są przechowywane w tabelach. Prostym sposobem myślenia o indeksach jest wyobrażenie sobie rozbudowanego arkusza kalkulacyjnego. Tego typu system nie zawsze sprzyja szybkiemu wyszukiwaniu; tam właśnie indeks staje się niezbędny. Jeśli nie ma indeksu, aparat bazy danych musi zacząć od pierwszego wiersza i przeglądać wszystkie wiersze w poszukiwaniu odpowiednich wartości. Jeśli jest to mały stół, to nic wielkiego, ale w przypadku większych tabel i aplikacji, w których mogą istnieć tabele z milionami, a nawet miliardami wierszy, staje się to problematyczne. Jak możesz sobie wyobrazić, przeszukiwanie tych wierszy jeden po drugim będzie czasochłonne, nawet na najnowszym sprzęcie. Rozwiązaniem jest utworzenie INDEKSU (lub więcej niż jednego) dla Twoich danych.

Co to jest indeks?

Indeks to zorganizowana tabela przeglądowa, która zawiera wskaźniki wskazujące, gdzie w bazie danych można pobrać dane. Ta koncepcja jest podobna do indeksów książkowych. W książce indeks zawiera numery stron, na których znajdują się różne tematy. W bazie danych indeks przechowuje wskaźniki w logicznej i posortowanej kolejności, co umożliwia szybkie wyszukiwanie w bazie danych. Wyobraź sobie książkę bez indeksu. Jeśli chcesz wyszukać informacje na określony temat, musisz zacząć od początku i przeglądać strony, aż znajdziesz informacje, których szukasz. Indeks książek rozwiązuje ten problem, informując dokładnie, na których stronach znajdują się informacje, których szukasz. Tak właśnie działa indeks MySQL.

Kiedy MySQL używa indeksów?

Za każdym razem, gdy serwer bazy danych musi wyszukać informacje, użyje indeksu, aby przyspieszyć proces. Przykładami tego są klauzule WHERE, JOIN ON, MIN/MAX i ORDER BY/GROUP BY. Jeśli Twoje zapytania będą często wyszukiwać lub dopasowywać kolumnę w którejkolwiek z tych sytuacji, powinieneś rozważyć utworzenie indeksu.

Czy indeksy poprawiają wydajność bazy danych?

W większości przypadków krótka odpowiedź brzmi:tak. W przypadku odczytów i przeszukiwania danych indeksy absolutnie zwiększają wydajność. Rezygnacja z pełnego skanowania tabel poprawi prawie każde zapytanie SELECT. To ma niewielką cenę. W przypadku kolumn, które są często manipulowane, każda zmiana wiąże się z kosztem. Może to spowodować zablokowanie WSTAWEK i UAKTUALNIEŃ w bazie danych.

Typowe typy indeksów MySQL

Istnieją trzy popularne typy indeksów MySQL:

  • Klucz główny
  • Indeks
  • Unikalny

KLUCZ PODSTAWOWY

Klucz podstawowy informuje serwer bazy danych, która kolumna (kolumny) w tabeli jest najważniejsza. Zazwyczaj jest to używane w przypadku kolumn identyfikatora auto_increment. Na przykład, jeśli masz tabelę zawierającą informacje o pracownikach, potrzebujesz klucza podstawowego w kolumnie „Identyfikator pracownika”. W innych tabelach, np. tabeli płac, po prostu odwołujesz się do EMPLOYEE_ID zamiast wszystkich danych pracownika.

INDEKS

Standardowy INDEX służy do informowania serwera bazy danych, że jedna lub więcej kolumn w tabeli będzie często przeszukiwanych, a zatem należy na nich utworzyć indeks. Można to zbudować podczas tworzenia tabeli lub jeśli później okaże się, że potrzebujesz indeksu w kolumnie, możesz go wtedy dodać.

UNIKALNE

Indeks UNIQUE jest nieco inny, ponieważ nakłada określone ograniczenia na to, co można zapisać w tabeli. Jeśli spróbujesz wstawić wiersz zawierający wartość, która jest już uwzględniona w danych, INSERT spowoduje błąd. Pozwala to na szybkie wyszukiwanie, a także pewną integralność danych.

Jak utworzyć indeks

Istnieje wiele sposobów tworzenia indeksu w kolumnie. Indeks można skonfigurować podczas tworzenia CREATE TABLE lub później za pomocą instrukcji ALTER TABLE lub CREATE INDEX.

Tworzenie indeksu PRIMARY KEY

Najłatwiejszym sposobem utworzenia indeksu PRIMARY KEY jest zrobienie tego podczas tworzenia tabeli. W tym samouczku użyjemy przykładowej tabeli pracowników. Tabela będzie miała trzy kolumny:ID, FIRSTNAME i LASTNAME. Kreacja może wyglądać mniej więcej tak:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32)
);

Ta instrukcja utworzy tabelę bez indeksu. Możemy dodać klucz główny za pomocą takiego stwierdzenia:

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT PRIMARY KEY (ID);

To mówi MySQL, że mamy klucz podstawowy w identyfikatorze kolumny.

Prostszym sposobem na to jest tworzenie tabeli. Zaczynając od nowa, odtworzymy tabelę i dodamy klucz podstawowy w jednej instrukcji.

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Ta pojedyncza instrukcja wykonuje te same zadania, co dwie pierwsze powyższe instrukcje. Klucz podstawowy może zawierać więcej niż jedną kolumnę, ale wszystkie kolumny muszą być unikatowe. Klucza podstawowego można użyć do zidentyfikowania dowolnego wiersza w tabeli.

Tworzenie indeksu za pomocą CREATE INDEX

Korzystając z przykładowej tabeli powyżej, wyobraź sobie, że firma ma tysiące pracowników i chcesz mieć możliwość szybkiego wyszukiwania pracowników według nazwiska. Z kluczem podstawowym może być tylko jeden wpis. Nie możesz mieć wielu osób, które mają ten sam identyfikator pracownika. W przypadku nazwisk dość często zdarza się, że wiele osób ma to samo nazwisko. Znowu jest na to kilka sposobów. Korzystając z powyższej tabeli:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Możemy dodać indeks do kolumny LASTNAME w ten sposób:

CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);

Wyszukiwania według LASTNAME będą teraz szybsze na tym stole. W tym przykładzie „idx1” to nazwa indeksu. Ułatwi to w przyszłości odwoływanie się do samego indeksu, jeśli zajdzie taka potrzeba.

Innym sposobem dodania indeksu do tabeli jest użycie polecenia ALTER TABLE. Aby osiągnąć to samo, co zrobiliśmy z poprzednią instrukcją, uruchomilibyśmy następujące polecenie:

ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);

Ostatnim sposobem dodania indeksu, który zaoszczędziłby trochę czasu, jest zrobienie tego podczas CREATE TABLE. Jeśli z góry wiesz, że będziesz wyszukiwać lub dołączać do określonej kolumny, możesz utworzyć początkową tabelę z już tam indeksem:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx1 (LASTNAME)
);

Wszystkie trzy z tych stwierdzeń dają ten sam wynik.

Indeksy wielokolumnowe

Indeks nie musi znajdować się tylko w jednej kolumnie. Jeśli chcemy szybszego wyszukiwania zarówno w FIRSTNAME, jak i LASTNAME, możemy utworzyć indeks w obu kolumnach. W stworzeniu tabeli wyglądałoby to tak:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx2 (LASTNAME,FIRSTNAME)
);

Używając polecenia UTWÓRZ INDEKS:

CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);

I na koniec polecenie ALTER TABLE:

ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);

Tworzenie UNIKALNEGO INDEKSU

Może się zdarzyć, że zechcesz utworzyć indeks w kolumnie, a także wymusić unikalność wszystkich wpisów w tej kolumnie. Jeśli rozszerzymy naszą przykładową tabelę o kolumnę BIURO (oznaczającą, które biuro w budynku mają), to możemy chcieć, aby był to indeks UNIQUE. Popracujmy z tą tabelą:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  OFFICE INT,
  PRIMARY KEY (ID)
);

Zauważ, że teraz mamy w tabeli zapisaną liczbę całkowitą, która oznacza, który urząd zajmuje dana osoba. Może to odnosić się do innej tabeli „BIURA”, która będzie zawierać informacje o różnych biurach w budynku.

Aby utworzyć indeks na ten temat, wydalibyśmy następujące polecenie:

CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);

Możesz użyć podobnych poleceń, aby je utworzyć w poleceniach CREATE TABLE i ALTER TABLE. Teraz, jeśli próbowałeś uruchomić te dwie wstawki:

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);

Otrzymasz błąd przy drugiej INSERT:

Duplicate entry '1' for key 'idx3'

Usuwanie indeksu

Może nadejść czas, kiedy nie będziesz już potrzebować indeksu w kolumnie. Być może zdałeś sobie sprawę, że nie przeszukujesz kolumny zbyt często, a indeks spowalnia wstawianie i aktualizowanie. W tym celu użyjemy polecenia DROP INDEX. Nasz stół powstał w ten sposób:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR,
  LASTNAME CHAR,
  PRIMARY KEY (ID),
  INDEX idx (LASTNAME,FIRSTNAME)
);

Jeśli chcemy usunąć indeks z kolumn LASTNAME i FIRSTNAME, wydamy to polecenie:

DROP INDEX IDX ON EMPLOYEE;

Wniosek

Indeksy bazy danych to podstawowe narzędzie optymalizujące szybkość wyszukiwania danych w strukturze, która wykorzystuje wydajność wyszukiwania i odczytu w tabeli. Ulepszanie indeksu jest głównie napędzane kosztem większej liczby zapisów i/lub miejsca w pamięci w celu utrzymania optymalnej struktury danych indeksu.

Bazy danych MySQL i MariaDB oferują wiele innych opcji wyszukiwania i odczytu, w tym wiele, które nie zostały tutaj omówione. Kluczowe dania na wynos obejmują: 

  • Poświęć trochę czasu na zaplanowanie swoich stołów z wyprzedzeniem.
  • Jeśli nie planujesz z wyprzedzeniem podczas tworzenia tabel, oceń kolumny, które są najczęściej przeszukiwane i utwórz dla nich indeks.

Zobacz to w akcji!

Nasza szeroka gama serwerów dedykowanych zapewnia moc, stabilność i bezpieczeństwo potrzebne do hostowania najmniejszej bazy danych dla rozwijających się firm, aż do konfiguracji serwerów klastrowych o wysokiej dostępności dla największych korporacji. Chcesz zobaczyć, jakie rozwiązania możemy zaoferować, aby spełnić Twoje potrzeby?

Zadzwoń do nas pod numer 800.580.4985 lub otwórz czat lub bilet, aby porozmawiać z jednym z naszych doświadczonych doradców ds. rozwiązań lub doświadczonych w zakresie hostingu, aby dowiedzieć się, jak możesz już dziś skorzystać z tej technologii!

Nawigacja po seriach<>

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. implodowanie listy do użycia w klauzuli MySQLDB IN w Pythonie

  2. Zapytanie o wycofanie MySQL

  3. Jak korzystać z ról, które zmieniły się w MySQL 8.0?

  4. W SQL / MySQL, jaka jest różnica między ON i WHERE w instrukcji join?

  5. Jak zmniejszyć/wyczyścić plik ibdata1 w MySQL?