MySQL Index: Handleiding voor aanmaken, toevoegen en verwijderen

โšก Slimme samenvatting

MySQL Deze handleiding over indexen legt uit hoe indexen gegevens snel sorteren en lokaliseren. Een index is een gesorteerde opzoekstructuur die is gemaakt op basis van een of meer kolommen; met CREATE INDEX wordt een index toegevoegd, met SHOW INDEXES wordt deze gecontroleerd en met DROP INDEX wordt deze verwijderd wanneer tabellen met veel schrijfbewerkingen de leesvoordelen overtreffen.

  • ๐Ÿ“š Behandel indexen als een woordenboek: Ze sorteren de kolomwaarden zodat de zoekmachine rijen kan vinden zonder de hele tabel te hoeven doorzoeken.
  • ๏ธ Maak aan tafel of erna: Definieer een index direct in CREATE TABLE of voeg deze later toe met CREATE INDEX aan een actieve tabel.
  • ๐Ÿ” Inspecteer met SHOW INDEXES: Gebruik SHOW INDEXES FROM table_name om elke index, sleutelonderdeel, kardinaliteit en uniciteitsvlag weer te geven.
  • ๐Ÿงน Verwerp de afwijking wanneer de schrijfkosten te hoog zijn: Indexen vertragen INSERT- en UPDATE-bewerkingen โ€” verwijder ongebruikte indexen met DROP INDEX om de schrijfsnelheid te herstellen.
  • ๐Ÿค– Gebruik AI voor het ontwerpen van indexen: AI-assistenten lezen logboeken van trage query's, suggereren kolomvolgordes voor samengestelde indexen en leggen EXPLAIN-plannen regel voor regel uit.

MySQL Indexconcept

Wat is een MySQL Inhoudsopgave?

An index in MySQL Een index is een datastructuur die kolomwaarden op een geordende manier opslaat, zodat de zoekmachine snel rijen kan opzoeken. Indexen worden aangemaakt op de kolom(men) die het meest worden gebruikt om gegevens te filteren. Zie een index als een alfabetisch gesorteerde lijst: het is veel sneller om een โ€‹โ€‹naam te vinden in een gesorteerde lijst dan in een ongesorteerde lijst.

Indexen brengen een afweging met zich mee: elke INSERT- of UPDATE-bewerking moet de index bijwerken, dus het toevoegen van te veel indexen aan een tabel die veel wordt beschreven, kan de algehele prestaties negatief beรฏnvloeden. Als vuistregel geldt: indexeer kolommen die voorkomen in WHERE-, JOIN- en ORDER BY-clausules op tabellen die vaker worden gelezen dan beschreven.

Waarom een โ€‹โ€‹index gebruiken?

Niemand houdt van trage systemen. Hoge prestaties zijn een topprioriteit voor vrijwel elke applicatie die gebruikmaakt van een database. Bedrijven investeren fors in hardware om query's snel te houden, maar hardware alleen heeft een limiet. Het optimaliseren van indexen is een goedkopere en effectievere oplossing.

MySQL Indexconcept

Trage reactietijden worden meestal veroorzaakt doordat rijen in fysieke volgorde op de schijf zijn opgeslagen. Zonder index, MySQL Elke rij moet worden gescand om de rijen te vinden die aan een predicaat voldoen โ€” een "volledige tabelscan". Indexen maken het mogelijk om elke rij te scannen. MySQL Spring direct naar de overeenkomende rijen, waardoor het queryplan verandert van O(n) naar ongeveer O(log n) voor B-tree-zoekopdrachten.

Syntaxis: Index maken

Een index kan op twee plaatsen worden gedefinieerd:

  1. Op het moment van het aanmaken van de tabel.
  2. Nadat de tabel al bestaat.

Voorbeeld: Een index aanmaken direct met CREATE TABLE

Voor de myflixdb In deze database verwachten we veel zoekopdrachten op de kolom met volledige namen. Het onderstaande script maakt een nieuwe database aan. members_indexed tabel met een index op de full_names kolom.

CREATE TABLE `members_indexed` (
    `membership_number` INT(11) NOT NULL AUTO_INCREMENT,
    `full_names`        VARCHAR(150) DEFAULT NULL,
    `gender`            VARCHAR(6)   DEFAULT NULL,
    `date_of_birth`     DATE         DEFAULT NULL,
    `physical_address`  VARCHAR(255) DEFAULT NULL,
    `postal_address`    VARCHAR(255) DEFAULT NULL,
    `contact_number`    VARCHAR(75)  DEFAULT NULL,
    `email`             VARCHAR(255) DEFAULT NULL,
    PRIMARY KEY (`membership_number`),
    INDEX (`full_names`)
) ENGINE = InnoDB;

Voer het script uit in MySQL Werkbank tegen de myflixdb database.

members_indexed tabel in MySQL Werkbank

verversen myflixdb om de nieuwe te zien members_indexed tafel. De full_names kolom verschijnt nu onder de Indexen knooppunt.

Naarmate het ledenaantal groeit, nemen zoekopdrachten op members_indexed die WHERE en ORDER BY gebruiken tegen full_names zijn veel sneller dan dezelfde zoekopdrachten op het origineel. members tabel zonder index.

Voeg een index toe nadat de tabel al bestaat.

Je zult vaak merken dat een bestaande tabel een index nodig heeft โ€” zoekopdrachten zijn traag en een EXPLAIN-plan laat een volledige tabelscan zien op een kolom die in de WHERE-clausule voorkomt. CREATE INDEX Deze instructie voegt een index toe zonder de tabel opnieuw aan te maken.

CREATE INDEX `id_index` ON `table_name` (`column_name`);

Concreet voorbeeld: het versnellen van zoekopdrachten op de title kolom van de movies tafel:

CREATE INDEX `title_index` ON `movies` (`title`);

Elke query die filtert op movies.title wordt nu ondersteund door de nieuwe index. Query's die filteren op andere kolommen scannen nog steeds de tabel, tenzij ze hun eigen index hebben.

Let op: Je kunt een samengestelde index maken over meerdere kolommen als je query's altijd filteren of sorteren op dezelfde combinatie. De volgorde is belangrijk: de eerste kolom bepaalt of de index kan worden gebruikt.

Lijst de indexen van een tabel

Gebruik SHOW INDEXES Om alle gedefinieerde indexen van een tabel te bekijken.

SHOW INDEXES FROM `table_name`;

Voorbeeld โ€” lijstindexen op de movies tafel:

SHOW INDEXES FROM `movies`;

Voer de instructie uit in MySQL Werkbank tegen myflixdb om de bestaande indexen en de kolommen die ze omvatten te bekijken.

Let op: Primaire en externe sleutels worden automatisch geรฏndexeerd door MySQLElke index heeft een unieke naam en geeft aan welke kolom(men) deze omvat.

Syntaxis: Drop Index

Gebruik DROP INDEX Het verwijderen van een bestaande index uit een tabel. Dit is handig wanneer een tabel met veel schrijfbewerkingen wordt vertraagd door een index die niet langer rendabel is bij het lezen.

DROP INDEX `index_id` ON `table_name`;

Concreet voorbeeld โ€” laat de full_names index van members_indexed:

DROP INDEX `full_names` ON `members_indexed`;

Types van MySQL Indexen

MySQL Ondersteunt verschillende indexsoorten, elk geschikt voor een andere werklast.

Type Doel
HOOFDSLEUTEL Unieke rij-identificatie; gegroepeerd met de tabelgegevens in InnoDB.
. Garandeert uniciteit en fungeert tegelijkertijd als index.
INDEX (B-boom) Standaard secundaire index die wordt gebruikt voor bereikquery's en gelijkheidszoekopdrachten.
HELE TEKST Geoptimaliseerd voor zoekopdrachten in natuurlijke taal met MATCH โ€ฆ AGAINST.
RUIMTELIJK R-tree-index voor GIS-datatypen zoals POINT en POLYGON.
HASH Gelijkheidszoekacties met constante tijdsduur; gebruikt door de MEMORY-opslagengine.
Samengesteld (meerdere kolommen) Combineert meerdere kolommen tot รฉรฉn index; houdt rekening met de regel van het meest linkse voorvoegsel.

Beste praktijken voor MySQL Indexen

De onderstaande gewoontes zorgen ervoor dat indexen nuttig blijven en voorkomen dat ze een ballast worden.

  • Index voor het zoekpatroon, niet voor de kolomnaam: Voeg indexen toe die overeenkomen met echte WHERE-, JOIN- en ORDER BY-clausules, en niet met "elke kolom die belangrijk lijkt".
  • Volgorde van de samengestelde index: De eerste kolom moet in de query voorkomen om de index te kunnen gebruiken.
  • Vermijd dubbele indexen: Een voorvoegsel van een samengestelde index dekt al zoekopdrachten in รฉรฉn kolom op dat voorvoegsel.
  • Inspecteer met EXPLAIN: Controleer of de planner daadwerkelijk de nieuwe index selecteert.
  • Verwijder ongebruikte indexen: . sys.schema_unused_indexes in MySQL 5.7+ om indexen te vinden die door niets worden gelezen.
  • Gegevenstypen matchen: Als een WHERE-clausule een VARCHAR-kolom vergelijkt met een getal, kan de index niet worden gebruikt vanwege een impliciete typeconversie.

Veelgestelde vragen

Een primaire sleutel identificeert elke rij uniek en is altijd geรฏndexeerd. Een algemene index versnelt zoekopdrachten, maar staat dubbele waarden toe. Elke primaire sleutel is een index, maar niet elke index is een primaire sleutel.

Vermijd indexen op zeer kleine tabellen, op kolommen met zeer weinig unieke waarden (lage kardinaliteit) en op tabellen die veel vaker worden beschreven dan gelezen. Elke extra index vertraagt โ€‹โ€‹elke INSERT-, UPDATE- en DELETE-bewerking.

Een samengestelde (meerdere-kolom) index omvat meer dan รฉรฉn kolom in een enkele index. Deze index respecteert de regel van het meest linkse voorvoegsel, waardoor deze query's kan verwerken die filteren op de eerste kolom, de eerste twee kolommen, enzovoort, maar niet op de tweede kolom alleen.

lopen EXPLAIN vรณรณr de SELECT-instructie. De sleutel De kolom laat zien welke index de optimizer heeft gekozen, terwijl type dan: en rijen Vertelt je of het toegangspad efficiรซnt is.

Een dekkende index bevat alle kolommen die de query nodig heeft, waardoor de engine de query beantwoordt op basis van de index alleen, zonder de tabel te hoeven lezen. EXPLAIN geeft in dat geval de melding "Using index" weer.

Veelvoorkomende redenen zijn onder andere het inpakken van de verpakking.ping de kolom in een functie (WHERE YEAR(col) = โ€ฆ), impliciete typeconversies, zeer lage cardinaliteit en verouderde statistieken. Uitvoeren ANALYZE TABLE om de statistieken te vernieuwen en te inspecteren EXPLAIN om de werkelijke reden.

AI-assistenten verwerken logbestanden van trage query's, classificeren de meest kostbare patronen, suggereren indexen met รฉรฉn kolom of samengestelde indexen en leggen EXPLAIN-plannen in begrijpelijke taal uit. Ze verkorten de afstemmingstijd voor routinematige workloads van uren naar minuten.

Ja. AI-tools zetten een verzoek zoals "versnel klantzoekopdrachten op basis van e-mailadres en aanmeldingsdatum" om in een werkende CREATE INDEX-instructie, bevelen de kolomvolgorde aan en leggen de verwachte impact op de lees- en schrijfsnelheid uit.

Vat dit bericht samen met: