Pārskats Kas ir vienots indekss un kas ir saliktais indekss? Kad izveidot jaunu saliktu indeksu un kam jāpievērš uzmanība saliktajā indeksā? Šis raksts galvenokārt ir dažu diskusiju kopsavilkums internetā.
Viens. Koncepcija
Viens indekss ir situācija, kad indekss ir uzskaitīts vienā kolonnā, tas ir, paziņojums par jauna indeksa izveidi tiek īstenots tikai vienā kolonnā.
Lietotāji var izveidot indeksus vairākās kolonnās, ko sauc par saliktajiem indeksiem (kombinētajiem indeksiem). Saliktie indeksi tiek izveidoti tieši tāpat kā atsevišķi indeksi. Taču saliktajiem indeksiem datu bāzes operāciju laikā ir nepieciešams mazāks pieskaitāmais izdevums, un tie var aizstāt vairākus atsevišķus indeksus. Ja rindu skaits tabulā ir daudz lielāks par atslēgu skaitu, šī metode var ievērojami paātrināt tabulas vaicājuma ātrumu.
Vienlaikus ir divi jēdzieni, šauri indeksi un plati indeksi, šauri indeksi attiecas uz indeksiem ar 1-2 kolonnām un parasti attiecas uz vienu indeksu, ja vien nav norādīts citādi. Plašs indekss ir indekss ar vairāk nekā 2 kolonnām.
Svarīgs indeksa izstrādes princips ir izmantot šaurus indeksus, nevis platus indeksus, jo šauri indeksi mēdz būt efektīvāki nekā kombinētie indeksi. Šaurāki indeksi dos optimizētājam lielāku izvēli, kas bieži palīdz uzlabot veiktspēju.
Divi. Lietošana
Indeksa izveide Indeksa IDX1 izveide tabulā1(COL1,COL2,COL3) Noskaidrot izvēlieties * no tabulas1, kur col1= A un col2= B un col3 = C
Šobrīd vaicājumu optimizētājs neskenē tabulu, bet tieši ņem datus no indeksa, jo šie dati ir indeksā, ko sauc par pārklājuma vaicājumu, un vaicājuma ātrums ir ļoti ātrs.
Trīs. Piezīmes:
1. Kad izmantot salikto indeksu Nosacījumā where lauks tiek indeksēts, un, ja tiek izmantoti vairāki lauki, tiek izmantots saliktais indekss. Parasti atlases laukā neveidojiet nekādus indeksus (ja vēlaties vaicāt atlasīt col1, col2, col3 no mytable, jums nav nepieciešams iepriekš minētais indekss). Indeksēšana, pamatojoties uz apstākļiem, ir ārkārtīgi svarīgs princips. Esiet uzmanīgi, lai neizmantotu pārāk daudz indeksu, pretējā gadījumā tam būs liela ietekme uz tabulu atjauninājumu efektivitāti, jo, darbojoties tabulās, jums ir jāpavada daudz laika, veidojot indeksus.
2. Saliktajiem indeksiem, izmantojot vaicājumu, vislabāk ir ievērot indeksu atrašanas secību, kas ir visefektīvākā. Piemēram: IDX1:izveidot indeksu IDX1 tabulā1(col2,col3,col5) atlasiet * no tabulas1, kur col2=A un col3=B un col5=D
Ja tas ir "izvēlieties * no tabulas1, kur col3=B un col2=A un col5=D" Vai arī "atlasiet * no tabulas1, kur col3=B" neizmantos indeksu, vai arī efekts nav pamanāms
3. Vai saliktais indekss aizstās vienu indeksu? Daudzi cilvēki domā, ka jebkura lauka pievienošana klasterētajam indeksam var uzlabot vaicājuma ātrumu, taču daži cilvēki ir neizpratnē: ja saliktie sagrupētie indeksa lauki tiek vaicāti atsevišķi, vai vaicājuma ātrums tiks palēnināts? Ar šo jautājumu apskatīsim šādu vaicājuma ātrumu (rezultātu kopa ir 250 000 datu vienību) :( datuma kolonna fariqi ieņem pirmo vietu saliktā apkopojuma indeksa sākuma kolonnā, bet lietotājvārds neibuyonghu ieņem otro vietu)
IDX1:create index idx1 on Tgongwen(fariqi,neibuyonghu)
(1) izvēlieties gid, fariqi, neibuyonghu, nosaukumu no Tgongwen kur fariqi>'2004-5-5'
Vaicājuma ātrums: 2513 ms
(2) izvēlieties gid, fariqi, neibuyonghu, nosaukumu no Tgongwen kur fariqi>'2004-5-5' un neibuyonghu='birojs'
Vaicājuma ātrums: 2516 ms
(3) izvēlieties gid, fariqi, neibuyonghu, nosaukumu no Tgongwen kur neibuyonghu='birojs'
Vaicājuma ātrums: 60280 milisekundes
No iepriekš minētajiem eksperimentiem mēs varam redzēt, ka, ja kā vaicājuma nosacījums tiek izmantota tikai klasterētā indeksa sākuma kolonna, visu kolonnu ar salikto sagrupēto indeksu vaicājuma ātrums ir gandrīz vienāds, pat nedaudz ātrāks nekā visu salikto indeksu kolonnu izmantošana (ja vaicājuma rezultātu kopu skaits ir vienāds). Ja kā vaicājuma nosacījumi tiek izmantotas tikai saliktā apkopotā indeksa kolonnas, kas nav sākuma kolonnas, šis indekss neko nedarīs. Protams, 1. un 2. paziņojuma vaicājuma ātrums ir vienāds, jo vaicājuma ierakstu skaits ir vienāds, ja tiek izmantotas visas saliktā indeksa kolonnas un vaicājuma rezultāti ir maz, tas veidos "indeksa ignorēšanu", lai varētu optimizēt veiktspēju. Ņemiet vērā arī to, ka neatkarīgi no tā, vai bieži izmantojat citas apkopotā indeksa kolonnas, vadošajai kolonnai ir jābūt visbiežāk lietotajai.
[Atsauce: vaicājumu optimizācijas un lapu veidošanas algoritma shēma http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]
4. Vai vienā kolonnā vienlaikus ir jāizveido viens indekss un salikts indekss? Eksperiments: Sysbase 5.0 tabulas tabula1 lauki: col1, col2, col3
Testa soļi: (1) Izveidojiet indeksu idx1 uz col1 Izpildīt atlasi * no tabulas1, kur col1=A izmanto idx1 Izpildīt atlasi * no tabulas1, kur col1=A un col2=B izmanto arī idx1
(2) Izdzēsiet indeksu idx1 un pēc tam izveidojiet idx2 (col1,col2) saliktajā indeksā Abos vaicājumos tiek izmantots idx2
(3) Ja pastāv abi indeksi idx1 un idx2 Tas nav tur, kur col1='A' izmanto idx1; kur col1=A un col2=B izmanto idx2. Tās vaicājumu optimizētājs izmanto vienu no iepriekš izmantotajiem indeksiem. Izmantojiet idx1 vai idx2.
Var redzēt, ka (1) Tabulai, ja ir salikts indekss (col1, col2), nav nepieciešams vienlaikus izveidot vienu indeksu uz col1. (2) Ja vaicājuma nosacījumi to prasa, varat pievienot salikto indeksu (col1, col2), kad col1 jau ir viens indekss, kas zināmā mērā var uzlabot efektivitāti. (3) Nav īpaši daudz priekšrocību, izveidojot saliktu indeksu ar vairākiem laukiem (kas satur 5 vai 6 laukus) vienlaicīgi, salīdzinoši runājot, indeksa izveide ar vairākiem šauriem laukiem (kas satur tikai vienu vai ne vairāk kā 2 laukus) var panākt labāku efektivitāti un elastību.
5. Vai man ir jāaptver vaicājums? Parasti vislabāk nav izmantot stratēģiju, kas uzsver pilnīgu vaicājumu pārklājumu. Ja visas kolonnas klauzulā Select ir pārrakstītas ar negrupētu indeksu, optimizētājs to atpazīs un nodrošinās labu veiktspēju. Tomēr tas bieži izraisa pārāk plašu indeksu un pārmērīgu paļaušanos uz varbūtību, ka optimizētājs izmanto politiku. Parasti šauri indeksi tiek izmantoti lielākam vaicājumu skaitam, kas nodrošina labāku veiktspēju lieliem vaicājumiem. |