Overzicht Wat is een enkele index en wat is een samengestelde index? Wanneer maak ik een nieuwe composietindex aan, en waar moet ik op letten in de samengestelde index? Dit artikel is voornamelijk een samenvatting van enkele discussies op het internet.
Een. Concept
Een enkele index is een situatie waarin de index in één kolom wordt vermeld, dat wil zeggen, de uitspraak om een nieuwe index aan te maken is geïmplementeerd op slechts één kolom.
Gebruikers kunnen indexen maken op meerdere kolommen, die samengestelde indexen (gecombineerde indexen) worden genoemd. Samengestelde indexen worden op exact dezelfde manier gemaakt als enkele indexen. Maar samengestelde indexen vereisen minder overhead tijdens databasebewerkingen en kunnen meerdere enkele indexen vervangen. Wanneer het aantal rijen in een tabel veel groter is dan het aantal sleutels, kan deze methode de querysnelheid van de tabel aanzienlijk verhogen.
Er zijn twee concepten tegelijk: smalle indexen en brede indexen, smalle indexen verwijzen naar indexen met 1-2 kolommen, en verwijzen over het algemeen naar één enkele index tenzij anders vermeld. Een brede index is een index met meer dan 2 kolommen.
Een belangrijk principe van indexontwerp is het gebruik van smalle indexen in plaats van brede indexen, omdat smalle indexen doorgaans effectiever zijn dan gecombineerde indexen. Smallere indexen geven de optimizer meer keuze, wat vaak helpt om de prestaties te verbeteren.
Twee. Gebruik
Maak een index aan Maak index IDX1 aan op table1(Col1,Col2,Col3) Vragen selecteer * uit tabel1 waarbij kol1= A en kol2= B en kol3 = C
Op dit moment scant de query-optimizer de tabel niet, maar neemt direct de data uit de index, omdat deze data in de index staat, wat een overlay-query wordt genoemd, en de querysnelheid zeer hoog is.
Drie. Notities:
1. Wanneer een samengestelde index gebruikt moet worden In de where-voorwaarde wordt het veld geïndexeerd, en als meerdere velden worden gebruikt, wordt een samengestelde index gebruikt. Over het algemeen moet je geen indexen bouwen in het select-veld (als je select, select, col2, col3 uit mytable wilt queryen, heb je bovenstaande index niet nodig). Indexeren op basis van waar condities is een uiterst belangrijk principe. Wees voorzichtig dat je niet te veel indexen gebruikt, anders heeft dat een grote impact op de efficiëntie van tabelupdates, omdat je veel tijd moet besteden aan het maken van indexen bij het bedienen van tabellen.
2. Voor samengestelde indexen is het bij het gebruik van een query het beste om de volgorde van het vinden van indexen te volgen, wat het meest efficiënt is. Bijvoorbeeld: IDX1: maak index idx1 aan op table1(col2,col3,col5) selecteer * uit tabel1 waarbij col2=A en col3=B en col5=D
Als het "selecteer * uit tabel1 waarbij col3=B en col2=A en col5=D" Of "selecteer * uit tabel1 waarbij col3=B" zal de index niet gebruiken, of het effect is niet merkbaar
3. Zal een samengestelde index een enkele index vervangen? Veel mensen denken dat het toevoegen van een willekeurig veld aan de geclusterde index de querysnelheid kan verbeteren, maar sommigen zijn in de war: als de samengestelde geclusterde indexvelden apart worden geraadpleegd, zal de zoeksnelheid dan vertragen? Laten we met deze vraag eens kijken naar de volgende querysnelheid (de resultaatset bestaat uit 250.000 gegevens): :( datumkolom fariqi staat op de eerste plaats in de startkolom van de samengestelde aggregatie-index, en de gebruikersnaam neibuyonghu op de tweede plaats)
IDX1:create index idx1 on Tgongwen(fariqi,neibuyonghu)
(1) selecteer gid, fariqi, neibuyonghu, titel van Tgongwen waar fariqi>'2004-5-5'
Querysnelheid: 2513 ms
(2) selecteer Gid, Fariqi, Neibuyonghu, titel van Tgongwen waar Fariqi>'2004-5-5' en Neibuyonghu='Kantoor'
Querysnelheid: 2516 ms
(3) selecteer gid, fariqi, neibuyonghu, titel van Tgongwen waar neibuyonghu = 'kantoor'
Querysnelheid: 60280 milliseconden
Uit bovenstaande experimenten zien we dat als alleen de startkolom van de geclusterde index als queryvoorwaarde wordt gebruikt, de querysnelheid van alle kolommen met de samengestelde geclusterde index bijna gelijk is, zelfs iets sneller dan het gebruik van alle samengestelde indexkolommen (wanneer het aantal zoekresultatensets gelijk is). Als alleen de niet-startkolommen van de samengestelde geaggregeerde index als queryvoorwaarden worden gebruikt, zal deze index niets doen. Natuurlijk is de querysnelheid van statements 1 en 2 hetzelfde omdat het aantal vermeldingen in de query gelijk is; als alle kolommen van de samengestelde index worden gebruikt en de queryresultaten zijn weinig, vormt dit een "indexoverride", zodat de prestaties geoptimaliseerd kunnen worden. Houd er ook rekening mee dat, of je nu vaak andere kolommen in de aggregate index gebruikt of niet, de leidende kolom degene moet zijn die het vaakst wordt gebruikt.
[Ref: Query Optimization en Pagineringsalgoritme Schema http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]
4. Moet ik één index en een samengestelde index tegelijkertijd op dezelfde kolom aanmaken? Experiment: Sysbase 5.0 tabel table1 velden: col1, col2, col3
Teststappen: (1) Maak de index idx1 aan op col1 Voer select * uit table1 waar col1=A idx1 gebruikt Voer select * uit uit table1 waarbij col1=A en col2=B ook idx1 gebruiken
(2) Verwijder de index idx1 en maak vervolgens een idx2 aan op (col1,col2) samengestelde index Beide queries gebruiken idx2
(3) Als beide indexen idx1 en idx2 bestaan Het is niet waar col1='A' idx1 gebruikt; waar col1=A en col2=B idx2 gebruikt. De query-optimizer gebruikt een van de eerder veelgebruikte indexen. Gebruik ofwel idx1 of idx2.
Dat is te zien (1) Voor een tabel, als er een samengestelde index op (kol1, kol2) is, is het niet nodig om tegelijkertijd één index op kol1 te maken. (2) Als de queryvoorwaarden dit vereisen, kun je de samengestelde index toevoegen op (col1, col2) wanneer er al één index op col1 is, wat de efficiëntie tot op zekere hoogte kan verbeteren. (3) Er zijn niet bijzonder veel voordelen aan het opstellen van een samengestelde index met meerdere velden (die 5 of 6 velden bevatten) tegelijk; relatief gezien kan het opstellen van een index met meerdere smalle velden (die slechts één, of maximaal 2 velden bevatten) een betere efficiëntie en flexibiliteit bereiken.
5. Moet ik de query dekken? Het is over het algemeen het beste om geen strategie te gebruiken die volledige query-dekking benadrukt. Als alle kolommen in de Select-clausule worden overschreven door een niet-geclusterde index, zal de optimizer dit herkennen en goede prestaties leveren. Dit resulteert echter vaak in een te brede index en een te grote afhankelijkheid van de kans dat de optimizer het beleid gebruikt. Typisch worden smalle indexen gebruikt voor een groter aantal zoekopdrachten, wat betere prestaties biedt voor grote zoekopdrachten. |