2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Sisällysluettelo
Mitä eroa on tavallisella ja ainutlaatuisella indeksillä?
Millaisia kenttiä yleensä valitsemme indeksien rakentamiseen?
Onko enemmän indeksejä parempia?
Mikä on vasemmanpuoleisin sovitusperiaate?
Vasemmanpuoleisin vastaavuusperiaate kyselyjärjestys
Mikä on indeksin painaminen? Lisätty MySQL5.6:een tietokyselyjen optimoimiseksi
Miten luodaan indeksi, jossa a>1 ja b=2 ja c <3?
(A,B,C) yhteisindeksi valitse * tbn:stä, jossa a= ja b in (?,?) ja c>?
Miten luodaan yhteinen indeksi, jossa a>100 ja b=100 ja c=123 järjestyksessä d?
Opin, että MySQL:llä onpääavainHakemisto, yksilöllinen indeksi, tavallinen indeksi, etuliiteindeksi,Unionin indeksiTämän tyyppiset indeksit.
Innodb-moottori edellyttää, että jokaisessa tietokantataulukossa on oltava apääavainindeksi,Indeksisarakkeen arvot eivät ole sallittujanolla-arvo。Esimerkiksi taulukon id-kenttä on ensisijainen avainindeksi
Ainutlaatuinen indeksi: Varmista tietosarakkeen jokaisen tietorivin yksilöllisyys, mutta salli nolla-arvot.
SittenKentille, joita kysytään usein, voimme luoda tälle kentälle normaalin indeksin.,Jos kenttiä on useita, voit harkita niiden luomistaUnionin indeksi,käyttääIndeksin kattavuusOminaisuudet parantavat kyselyn tehokkuutta.
Pitkälle tekstille, merkkijonolle ja muun tyyppisille kentille, kuten artikkelien otsikoille, tuotenimille jne., voimme indeksoida vain näiden kenttien etuliiteosan, eliLuo etuliiteindeksi vähentääksesi indeksin tallennustilaa.
Yksilöllinen indeksi voi olla hieman nopeampi, kun haetaan yksittäistä arvoa, koska se voi lopettaa haun löydettyään ensimmäisen vastaavuuden.
Lisäys- ja päivitystoiminnoissa normaali indeksi voi olla hieman nopeampi, koska se ei vaadi ainutlaatuisuustarkistuksia.
Tavallisten indeksisarakkeiden arvot voidaan toistaa, mutta yksilöllisten indeksisarakkeiden arvojen on oltava yksilöllisiä Kun lisäämme toistuvan arvon yksilölliseen indeksiin, virheilmoitus johtuu ainutlaatuisuusrajoituksesta.
mielestäniTavallisen indeksin päivityssuorituskyky on parempi, koska kun tavallinen hakemisto päivitetään, jos päivitetty tietosivu ei oleMuisti Jos näin on, voit tallentaa päivitystoiminnon suoraan välimuistiin muutospuskuriin, jolloin päivitys suoritetaan loppuun. (ei vaadi yksilöllisyyden tarkistusta)
mutta,Ainutlaatuisella hakemistolla on oltava yksilölliset rajoitukset, jos päivitetty tietosivu ei oleMuistiJos näin on, sinun on luettava vastaava tietosivu levyltä muistiin selvittääksesi, onko kyseessä ristiriita.IOPääsy.
Koska tavalliset indeksit voivat käyttää muutospuskuriominaisuutta, tavallisten indeksien päivitys on nopeampaa kuin yksilöllisten indeksien.Vähentynyt satunnainen levykäyttö, joten päivityksen suorituskyky on parempi
Kun InnoDB luo klusteroidun indeksin, se valitsee eri sarakkeita indekseiksi eri skenaarioiden mukaan:
Jos ensisijainen avain on olemassa, sitä käytetään oletusarvoisesti klusteroidun indeksin indeksiavaimena.
Jos ensisijaista avainta ei ole, valitseEnsimmäinen ei sisällä NULL arvoAinoa sarake on asklusteroitu indeksiindeksi avain
Jos kumpaakaan yllä olevista ei ole, InnoDB luo automaattisesti implisiittisen automaattisesti kasvavan rivisarakkeen klusteroidun indeksin indeksiavaimeksi.
Skenaariot, joissa indeksointia voidaan soveltaa:
Kentillä on ainutlaatuisuusrajoituksia, kuten tuotekoodi
Kentät, joita käytetään usein WHERE-kyselyehdoissa, joka voi parantaa koko taulukon kyselyn nopeutta Jos kyselyehto ei ole kenttä, voidaan muodostaa yhteinen indeksi
Kentät, joita käytetään usein GROUPBY:ssä ja ORDER BY:ssä, joten sinun ei tarvitse lajitella uudelleen haettaessa, koska kaikki B+-puun tietueet lajitellaan indeksin luomisen jälkeen.
Skenaariot eivät sovellu indeksointiin
Kenttiä ei käytetä WHERE-ehdoissa, GROUP BY, ORDER BY, indeksin arvo on pikapaikannus Jos kenttää ei voi sijoittaa, ei yleensä tarvitse luoda indeksiä, koska indeksi vie fyysistä tilaa.
Heikosti erottuva kentät , ei ole tarvetta luoda indeksiä, esimerkiksi sukupuolikentässä on vain miehet ja naiset. saada.Näissä tapauksissa on parempi olla indeksoimatta, koska MySQLYksi on vieläkyselyn optimoija, kun kyselyn optimoija havaitsee, että tietty arvo esiintyy suurella prosenttiosuudella taulukon tietoriveistä, se yleensä jättää indeksin huomioimatta ja suorittaaTäysi taulukon skannaus。
Usein päivitetyt kentätälä esimerkiksi indeksoi verkkokauppaprojektien käyttäjäsaldoa, koska indeksikenttiä muutetaan usein.ylläpitää B+puujärjestyksessä, silloin tarvitaan usein indeksien uudelleenrakentamista, ja tämä prosessi vaikuttaa tietokannan suorituskykyyn.
Järjestämättömien arvojen käyttöä ei suositella(kuten henkilökortti, UUID) indeksiksi, kun ensisijainen avain on epävarma, se aiheuttaa usein lehtien solmujen halkeilua ja levymuistin pirstoutumista.
Tietotaulukko on pienempi: Kun taulukon datamäärä on pieni tai kun kysely edellyttää suuren osan taulukon tiedoista skannausta, tietokannan optimoija voi valita koko taulukon tarkistuksen indeksin käyttämisen sijaan. Tässä tapauksessa indeksin ylläpitokustannukset voivat olla suuremmat kuin suorituskyvyn lisäys.
Ei, vaikka indeksit voivat parantaa kyselyn tehokkuutta, yhden indeksin lisääminen tarkoittaa, että luodaan uusi B+-puuindeksi, joka vie tallennustilaa varsinkin, kun taulukkotietojen määrä on erittäin suuri, indeksi vie enemmän tilaa.
Mitä enemmän indeksejä on, sitä enemmän tietokannan kirjoitusteho heikkenee, koska aina kun lisäät, poistat tai muokkaat taulukkoa, sinun on säilytettävä kunkin B+-puuindeksin järjestys.
Olen käyttänyt näitä optimointimenetelmiä
Voimme luoda SQL:lle, joka tarvitsee tietoja useilta kentiltäUnionin indeksi, joten kyselymenetelmästä tuleekattava indeksi, välttäen taulukon taustan ja vähentäen suurta määrää I/O-toimintoja.
meidänpääavainIndeksit ovat edullisesti nousevia arvoja, koska hakemistomme tallentaa tiedot järjestyksessä, jos ensisijaisen avaimen arvo on satunnainen, sivun jakaminen voi aiheuttaa suuren määrän muistin katkelmia, joten hakemistorakenne ei ole kompakti vaikuttaa kyselyn tehokkuuteen.
me haluammeVältä hakemistovirheiden kirjoittamista SQL Lausekkeet, kuten älä suorita vasenta tai vasenta sumeaa hakua hakemistosarakkeille, eivät suorita laskutoimituksia, funktioita ja tyyppimuunnostoimintoja indekseille Jotta yhteisiä indeksejä voidaan käyttää oikein, sinun on noudatettava vasemmanpuoleisinta täsmäämisperiaatetta jne.Jos WHERE-lauseessa oleva ehtosarake ennen OR:ta on indeksisarake ja OR:n jälkeinen ehtosarake ei ole indeksisarake, indeksi epäonnistuu.
Käytä ei ole yhtä suuri kuin (
<>
) tai NOT-operaattori: Nämä operaattorit yleensä mitätöivät indeksin, koska ne skannaavat koko taulukon.OR-operaattori: Jos OR-funktiota käytetään kyselyehdossa ja OR:n molemmilla puolilla on eri indeksejä, näitä indeksejä ei saa käyttää.
käyttää
OR
operaattori, josOR
Molemmilla puolilla on erilaisia indeksejä, eikä tietokantakone voi useimmissa tapauksissa käyttää useita indeksejä samanaikaisesti kyselyn optimointiin.Tämä onkoskaOR
Operaattorin tarvitsee vain täyttää kummankin puolen ehdot, mikä lisää kyselyn optimoinnin monimutkaisuutta.
Indeksointiin johonkin suureen merkkijonoon, voimme harkita käyttöäetuliiteindeksiVain hakemistosarakkeen etuliiteosa indeksoidaan hakemiston tallennustilan säästämiseksi ja kyselyn suorituskyvyn parantamiseksi.
Indeksi on parasta asettaa arvoon EI TYHJÄ : Jotta indeksiä voitaisiin hyödyntää paremmin, indeksisarakkeen arvoksi tulee asettaa NOT NULL -rajoitus. Syitä on kaksi:
NULL-arvon esiintyminen indeksisarakkeissa tekee optimoijan indeksin valinnasta monimutkaisempaa, mikä vaikeuttaa toimintojen, kuten laskun, optimointia.
NULL-arvo on merkityksetön arvo, mutta se vie fyysistä tilaa. Siinä on nolla-arvosarake.NULL:n tallentamiseen käytetään vähintään 1 tavu arvoluettelo
ei.
OpinVaikka kysely käyttää indeksiä, se ei välttämättä käytä indeksiä.
Esimerkiksi: Kun kyselykäskymme suorittaa vasemman sumean vastaavuuden, lausekkeen laskennan, funktion ja implisiittisen tyypin muunnostoiminnot indeksikentässä, kyselykäsky ei voi mennä indeksin läpi ja kyselymenetelmästä tulee koko taulukon tarkistus.
Ja käytämmeUnionin indeksiJos kyselyssä ei noudateta vasemmanpuoleisinta täsmäytysperiaatetta, tapahtuu myös indeksivirhe.。
Optimoija onValitse kyselymenetelmä kustannusnäkökohtien perusteella, käytettäessä toissijaista indeksiä kyselyyn, optimoija laskee taulukon palautuksen ja täyden taulukon skannauksen kustannukset. Jos taulukon palautuksen hinta on liian korkea, optimoija ei käytä indeksiä, vaan käyttää koko pöydän skannaus.
Ei osu indeksiin.
Koska mysql kohtaaMerkkijonojen ja numeroiden vertailutapahtuu milloinimplisiittinen tyyppimuunnos, tuleeMuunna merkkijonoobjekti numeroksi, tämä muunnosprosessi itse asiassa sisältäätoiminto . Mainitsemassasi kyselyssä päivämääräkenttä on merkkijono, joten kun implisiittinen tyyppimuunnos tapahtuu, sitä käytetään päivämääräindeksikenttään, jos indeksille suoritetaan funktiolaskenta, indeksi ei kelpaa.
Esimerkiksi kokonaislukutyyppisille hakemistosarakkeille
id
Sarake, jonka arvo on tallennettu suoraan indeksiin ilman funktion laskentaa.Tämä tarkoittaa käyttöä kyselyssäid
Kun sovitetaan, se ei ole välttämätöntäid
Suorita toiminnallisia laskelmia tai muunnoksia ja vertaa yksinkertaisesti kokonaislukuarvoja.
Opin, että MySQL8.0 voi lisätä kenttiätoimintoindeksi, tämä uusi ominaisuus voi ratkaista indeksivirheen ongelman käytettäessä hakemiston toimintoja.
Toinen uusi ominaisuus onhakemiston ohitusskannaus, Ennen versiota 5.7 yhteisindeksiä käytettäessä, jos vasemmanpuoleisin täsmäytysperiaate ei täyty, hakemistovirhe tapahtuu kuitenkin sen jälkeen, kun hakemiston ohitusskannaus on otettu käyttöön versiossa 8.0, yhteisiä indeksejä voidaan edelleen käyttää, vaikka vasemmanpuoleisin täsmäysperiaate olisikin käytössä. ei noudateta.
Oletetaan, että on (a, b, c) yhteinen indeksi. Sen tallennusjärjestys on lajitella ensin a:n mukaan, sitten lajitella b:n mukaan, kun a on sama, ja sitten c:n mukaan, kun b on sama. Tästä ominaisuudesta johtuen yhteisiä indeksejä käytettäessä on käytössä vasemmanpuoleinen täsmäysperiaate. Erityiset säännöt ovat:
MySQL:n yhdistetty indeksi alkaaVasemmanpuoleisin hakemistosarake alkaa vastata kyselyn ehtoja ja vastaa sitten järjestyksessä vasemmalta oikealle. Jos kyselyehdot eivät käytä saraketta, kaikkia sarakkeen oikealla puolella olevia sarakkeita ei voida indeksoida.
Kun saraketta käytetään kyselytilassa,Tämän sarakkeen arvo sisältää kuitenkin aluekyselyn, ja aluekyselyn kenttiä voidaan käyttääUnionin indeksi, mutta yhteisindeksiä ei voi käyttää aluekyselykentän takana olevissa kentissä.
Siksi, kun käytämme yhteisiä indeksejä, meidän on noudatettava vasemmanpuoleisinta vastaavuusperiaatetta, muuten joitain indeksikenttiä ei ehkä indeksoida.
suurin osaAseta kentät erottuvamminUnionin indeksiäärivasemmalla, apuaParanna indeksin suodatustehoa, kentät, kuten UUID, sopivat paremmin indeksointiin tai sijoitukseen yhteisen indeksisarakkeen yläosassa.
Jos kenttä, jonka erottelu on vähäistä, sijoitetaan yhteisindeksin vasemmalle puolelle, kyselyn optimoija voi valita koko taulukon tarkistuksen indeksin käyttämisen sijaan.
Yhteysindeksin vasemmanpuoleisin täsmäytysperiaate, inKun kohtaat alueen kyselyn (kuten >, <), haku pysähtyy, eli aluekyselyn kentät voivat käyttää yhteisindeksiä, mutta aluekyselykentän takana olevat kentät eivät voi käyttää yhteisindeksiä.Kuitenkin neljän alueen kyselyn >=, <=, BETWEEN ja kuten etuliitehakujen kohdalla haku ei lopu.
MySQL:ssä BETWEEN sisältää arvo1- ja arvo2-raja-arvot, jotka ovat samanlaisia kuin >= ja =<.
Viitelinkki https://zhuanlan.zhihu.com/p/573138586
select * from T where c=1 and a=2 and b=3;
abc voidaan indeksoida, koska Kyselyn ehtokenttien järjestys ei vaikuta, MySQL-optimoija auttaa meitä säätämään kenttien kyselyjärjestystä, joten se noudattaa myös vasemmanpuoleisinta vastaavuusperiaatetta.
Indeksin painaminen voi pienentäätoissijainen indeksiTaulukon palautustoiminto kyselyn aikana parantaa kyselyn tehokkuutta, koska se tekee niin Palvelinkerros on vastuussa joistakin asioista, joita tallennuskonekerros käsittelee.Meni käsittelemään sitä.
Kun painetaan optimointia käyttämättä indeksiehtoja, tallennuskone noutaa tiedot indeksin kautta ja palauttaa ne sitten MySQL Serveriin.MySQL-palvelin Tee arviot suodattimen olosuhteista.
Jos indeksoiduille sarakkeille on olemassa tiettyjä arviointiehtoja, MySQL Server työntää tämän osan arviointiehdoista tallennuskoneeseen, ja sitten tallennuskone arvioi, täyttääkö indeksi ehtoja, jotka ovat indeksoidut. MySQL-palvelin vain, kun indeksi täyttää ehdot, tiedot haetaan ja palautetaan MySQL-palvelimelle.
Hakemiston tilan pushdown-optimointi voi vähentää sitä, kuinka monta kertaa tallennuskone tekee kyselyitä taustalla olevasta taulukosta, ja voi myös vähentää MySQL Kuinka monta kertaa palvelin vastaanotti tietoja tallennuskoneesta.
select * from t_user where age > 20 and reward = 100000;
Luo (abc), (acb), (ab), (ac) yhteisindeksi, vain a voi indeksi
Luo (cab), (cba), (ca), (cb) yhteiset indeksit, vain c voi indeksoida
Luo (ba) yhteinen indeksi, sekä b että a voidaan indeksoida
Luo (bc) yhteisindeksi, sekä b että c voidaan indeksoida
luo (bac) Unionin indeksi, b ja a voidaan molemmat indeksoida, mutta ne ovat hitaampia kuin (ba) yhteisindeksillä on vielä yksi etu, c-kentässä voiindeksi alaspäin, vähentää taulukon palautusten määrää;
luoda(bca) Unionin indeksi, sekä b että c voidaan indeksoida, mutta sillä on yksi etu enemmän kuin (bc) yhteisindeksi, a-kenttä voiindeksi alaspäin, vähentää taulukon palautusten määrää;
select * from tbn where a=? and b in (?,?) and c>?
Indeksoidaanko se?Tämä kysely käyttää yhteisindeksiä (A,B,C)
, koska ehto perustuu indeksisarakkeeseen A
、B
、C
Tilaus tulee, mikä on ihanteellinen käyttöskenaario.
varten A=?
: Tämä ehto on tarkka vastaavuus. MySQL käyttää indeksiä paikantaakseen ehdon. A=?
ennätys.
varten B IN (?, ?)
: Tämä ehto määrittää B
Sarake voi ottaa kaksi mahdollista arvoa. MySQL käyttää hakemistoa löytääkseen kaikki osumatA=?
jaB
Sarake on tietue, jossa on jompikumpi näistä kahdesta arvosta.
varten C>?
: Tämä ehto on aluekysely.perustuu joA
jaB
Suodattimen perusteella MySQL jatkaa indeksin käyttöä etsimiseenC
Tietueet, joiden sarakearvot ovat määritettyä arvoa suuremmat.
mielestäniPerustaa bcda järjestyksessäUnionin indeksiParemmin, tällä hetkellä sekä b- että c-kentät voidaan indeksoida, jad voi käyttää hakemistojärjestystä välttääkseen tiedostojen lajittelun (ylimääräinen lajittelu), vaikka viimeistä kenttää ei voida indeksoida (a on epäkunnossa), se voidaan työntää alas indeksin avulla taulukon palautusten määrän vähentämiseksi.
Yhteisindeksin järjestys on ensin nimi, sitten ikä. Rakenteellisesti se lajitellaan ensin nimen mukaan ja sitten iän mukaan, jos nimet ovat yhtä suuret.Siksi optimoijan on täsmättävä nimi ensin Nimi on tällä hetkellä oikea sumea kysely, eikä hakemistovirheitä tapahdu, joten tämä SQL voi käyttää yhteistä indeksointia.
Tarkemmin sanottuna vain nimi voidaan indeksoidaNimioikean sumean kyselyn jälkeen ikäkentän arvot eivät ole järjestyksessä, joten ikää ei voi indeksoida, mutta ikää voidaan indeksoida.indeksi alaspäin。
Viimeksi kysytyt kentät ovat id ja name Nämä kaksi kenttää löytyvät yhteishakemistosta, joten taulukkoa ei tarvitse palauttaa.
Nimeä oikea sumea kysely on aluekysely, eikä seuraavia kenttiä voida indeksoida