sql >> Database >  >> RDS >> Database

Hoe werkt indexeren?

Wat doet indexeren?

Indexeren is de manier om een ​​ongeordende tabel in een volgorde te krijgen die de efficiëntie van de zoekopdracht tijdens het zoeken maximaliseert.

Wanneer een tabel niet-geïndexeerd is, zal de volgorde van de rijen waarschijnlijk niet waarneembaar zijn door de zoekopdracht als op enigerlei wijze geoptimaliseerd, en uw zoekopdracht zal daarom lineair door de rijen moeten zoeken. Met andere woorden, de zoekopdrachten zullen elke rij moeten doorzoeken om de rijen te vinden die aan de voorwaarden voldoen. Zoals u zich kunt voorstellen, kan dit lang duren. Door elke rij heen kijken is niet erg efficiënt.

De onderstaande tabel vertegenwoordigt bijvoorbeeld een tabel in een fictieve gegevensbron, die volledig ongeordend is.

company_id eenheid eenheidskosten
10 12 1,15
12 12 1,05
14 18 1.31
18 18 1.34
11 24 1,15
16 12 1.31
10 12 1,15
12 24 1.3
18 6 1.34
18 12 1.35
14 12 1,95
21 18 1.36
12 12 1,05
20 6 1.31
18 18 1.34
11 24 1,15
14 24 1,05

Als we de volgende query zouden uitvoeren:

SELECT
	company_id,
	units,
	unit_cost
FROM
	index_test
WHERE
	company_id = 18

De database zou alle 17 rijen moeten doorzoeken in de volgorde waarin ze in de tabel staan, van boven naar beneden, één voor één. Dus om te zoeken naar alle mogelijke instanties van de company_id nummer 18, de database moet door de hele tabel kijken voor alle verschijningen van 18 in de company_id kolom.

Dit zal alleen maar meer en meer tijd in beslag nemen naarmate de tafel groter wordt. Naarmate de verfijning van de gegevens toeneemt, zou er uiteindelijk kunnen gebeuren dat een tabel met een miljard rijen wordt samengevoegd met een andere tabel met een miljard rijen; de zoekopdracht moet nu twee keer zoveel rijen doorzoeken die twee keer zoveel tijd kosten.

Je kunt zien hoe dit problematisch wordt in onze altijd met gegevens verzadigde wereld. Tabellen worden groter en zoeken neemt toe in uitvoeringstijd.

Het opvragen van een niet-geïndexeerde tabel, indien visueel gepresenteerd, zou er als volgt uitzien:

Wat indexering doet, is dat de kolom waarin de zoekvoorwaarden zich bevinden in een gesorteerde volgorde worden geplaatst om te helpen bij het optimaliseren van de zoekopdrachtprestaties.

Met een index op de company_id kolom, zou de tabel er in wezen als volgt uit zien:

company_id eenheid eenheidskosten
10 12 1,15
10 12 1,15
11 24 1,15
11 24 1,15
12 12 1,05
12 24 1.3
12 12 1,05
14 18 1.31
14 12 1,95
14 24 1,05
16 12 1.31
18 18 1.34
18 6 1.34
18 12 1.35
18 18 1.34
20 6 1.31
21 18 1.36

Nu kan de database zoeken naar company_id nummer 18 en retourneer alle gevraagde kolommen voor die rij en ga vervolgens naar de volgende rij. Als de comapny_id . van de volgende rij nummer ook 18 is, dan worden alle kolommen geretourneerd die in de query zijn gevraagd. Als de company_id . van de volgende rij 20 is, weet de zoekopdracht te stoppen met zoeken en wordt de zoekopdracht voltooid.

Hoe werkt indexeren?

In werkelijkheid herschikt de databasetabel zichzelf niet elke keer dat de queryvoorwaarden veranderen om de queryprestaties te optimaliseren:dat zou onrealistisch zijn. Wat er in werkelijkheid gebeurt, is dat de index ervoor zorgt dat de database een gegevensstructuur creëert. Het type datastructuur is zeer waarschijnlijk een B-Tree. Hoewel de voordelen van de B-Tree talrijk zijn, is het belangrijkste voordeel voor onze doeleinden dat het sorteerbaar is. Wanneer de gegevensstructuur op volgorde is gesorteerd, wordt onze zoektocht efficiënter om de voor de hand liggende redenen die we hierboven hebben aangegeven.

Wanneer de index een gegevensstructuur op een specifieke kolom creëert, is het belangrijk op te merken dat er geen andere kolom in de gegevensstructuur is opgeslagen. Onze gegevensstructuur voor de bovenstaande tabel bevat alleen de company_id nummers. Eenheden en unit_cost wordt niet vastgehouden in de gegevensstructuur.

Hoe weet de database welke andere velden in de tabel moeten worden geretourneerd?

Database-indexen zullen ook verwijzingen opslaan die eenvoudigweg referentie-informatie zijn voor de locatie van de aanvullende informatie in het geheugen. In principe bevat de index de company_id en het thuisadres van die specifieke rij op de geheugenschijf. De index ziet er in werkelijkheid als volgt uit:

company_id aanwijzer
10 _123
10 _129
11 _127
11 _138
12 _124
12 _130
12 _135
14 _125
14 _131
14 _133
16 _128
18 _126
18 _131
18 _132
18 _137
20 _136
21 _134

Met die index kan de zoekopdracht alleen zoeken naar de rijen in de company_id kolom met 18 en vervolgens met behulp van de aanwijzer naar de tabel gaan om de specifieke rij te vinden waar die aanwijzer zich bevindt. De query kan dan in de tabel gaan om de velden op te halen voor de gevraagde kolommen voor de rijen die aan de voorwaarden voldoen.

Als de zoekopdracht visueel zou worden weergegeven, zou deze er als volgt uitzien:

Samenvatting

  • Indexeren voegt een gegevensstructuur toe met kolommen voor de zoekvoorwaarden en een aanwijzer
  • De aanwijzer is het adres op de geheugenschijf van de rij met de rest van de informatie
  • De indexgegevensstructuur is gesorteerd om de query-efficiëntie te optimaliseren
  • De query zoekt naar de specifieke rij in de index; de index verwijst naar de aanwijzer die de rest van de informatie zal vinden.
  • De index vermindert het aantal rijen dat de zoekopdracht moet doorzoeken van 17 naar 4.

  1. Vergelijken met datum in Oracle sql

  2. Voer sp_msforeachdb uit in een Java-toepassing

  3. Bewaar uitvoer van sql-functie naar csv-bestand (COPY) met dynamische bestandsnaam

  4. Hoe gebruik je Alias ​​in Where-clausule?