MySQL indekso ir užklausų optimizavimas. Indeksų naudojimas mysql duomenų bazėje Mysql unikalus indeksas keliuose laukuose

Kas yra indeksai?

Niekam nepatinka lėtos sistemos.

Aukštas sistemos našumas yra labai svarbus beveik visose duomenų bazių sistemose.

Daugelis įmonių daug investuoja į aparatinę įrangą, kad duomenų gavimas ir manipuliavimas būtų greitesnis.

Tačiau investicijos į aparatinę įrangą yra ribotos.

Duomenų bazės optimizavimas yra pigesnis ir geresnis sprendimas.

Šiuo tikslu galime naudoti INDEKSUS.

  • Lėtas atsako laikas dažniausiai atsiranda dėl to, kad įrašai atsitiktinai saugomi duomenų bazės lentelėse.
  • Paieškos užklausos turi pereiti visus atsitiktinai saugomus įrašus vieną po kito, kad būtų galima rasti norimus duomenis.
  • Dėl to duomenų bazės prastai veikia, kai reikia gauti duomenis iš didelių lentelių
  • Tokiose situacijose praverčia indeksai. Indeksai rūšiuoja duomenis nuosekliai. Pagalvokite apie indeksą kaip abėcėlės tvarka surūšiuotą sąrašą. Lengviau ieškoti vardų, kurie buvo surūšiuoti abėcėlės tvarka, nei tų, kurie nesurūšiuoti.
  • INDEX“ sukuriami stulpelyje (-iuose), kuris (-i) bus naudojamas duomenims filtruoti.
  • Naudojant indeksus lentelėse, kurios dažnai atnaujinamos, gali sumažėti našumas. Taip yra todėl, kad MySQL sukuria naują indekso bloką kiekvieną kartą, kai duomenys pridedami arba atnaujinami lentelėje. Paprastai rodyklės turėtų būti naudojamos lentelėse, kurių duomenys dažnai nesikeičia, bet dažnai naudojami pasirinktose paieškos užklausose.

Sukurkite pagrindinę indekso sintaksę

Indeksus galima apibrėžti 2 būdais

1. Lentelės sukūrimo metu

2. Sukūrus lentelę

Tikimės, kad mūsų myflixdb duomenų bazėje bus atlikta daug paieškų visu vardu.

Stulpelį „full_names“ pridėsime prie indekso naujoje lentelėje „members_indexed“.

Žemiau pateiktas scenarijus padeda mums tai pasiekti.

KURTI LENTELĘ `members_indexed` (`nario_numeris` int(11) NOT NULL AUTO_INCREMENT, `full_names` varchar(150) DEFAULT NULL, `gender` varchar(6) DEFAULT NULL, `date_of_physical_data2, DEFA`ultcal NULLaddress5, DEFA`ult ) NUMATYTOJI NULL, `pašto_adresas` varchar(255) DEFAULT NULL, `contact_number` varchar(75) DEFAULT NULL, `email` varchar(255) NUMATYTOJI NULL, PIRMINIS RAKTAS (narystės_numeris`), INDEX(ENGINE_names=no) ;

Vykdykite aukščiau pateiktą SQL scenarijų „MySQL“ darbastalyje prieš „myflixdb“.

Atnaujinus myflixdb rodoma naujai sukurta lentelė, pavadinta Members_indexed.

" Pastaba" Lentelėje nariai_indexed indeksų mazge yra "full_names".

Plečiantis narių bazei ir didėjant įrašų skaičiui , paieškos užklausos lentelėje Members_indexed, kuriose naudojamos sąlygos WHERE ir ORDER BY, bus daug greitesnės, palyginti su užklausomis, atliekamomis narių lentelėje be indekso.

Pridėti indekso pagrindinę sintaksę

Aukščiau pateiktame pavyzdyje indeksas buvo sukurtas apibrėžiant duomenų bazės lentelę. Tarkime, kad jau turime apibrėžtą lentelę, o paieškos užklausos joje yra labai lėtos. Jie užtrunka per ilgai, kol grąžinami rezultatai. Ištyrę problemą, sužinome, kad galime žymiai pagerinti sistemos našumą, sukūrę INDEX dažniausiai naudojamame WHERE sąlygos stulpelyje.

Norėdami pridėti indeksą, galime naudoti šią užklausą

CREATE INDEX ID_index ON lentelės_pavadinimas(stulpelio_pavadinimas);

Tarkime, kad paieškos užklausos filmų lentelėje yra labai lėtos ir norime naudoti „filmo pavadinimo“ indeksą, kad paspartintume užklausas. Tam galime naudoti šį scenarijų.

KURTI RODYKLĄ `title_index` ON `movies`(`title`);

Vykdant aukščiau pateiktą užklausą, filmų lentelės pavadinimo lauke sukuriama rodyklė.

Tai reiškia, kad visos paieškos užklausos filmų lentelėje, naudojant „pavadinimą“, bus greitesnės.

Tačiau paieškos užklausos kituose filmų lentelės laukuose vis tiek bus lėtesnės, palyginti su užklausomis pagal indeksuotą lauką.

Atminkite, kad jei reikia, galite kurti indeksus keliuose stulpeliuose, atsižvelgdami į laukus, kuriuos ketinate naudoti savo duomenų bazės paieškos varikliui.

Jei norite peržiūrėti tam tikroje lentelėje apibrėžtus indeksus, galite tai padaryti naudodami šį scenarijų.

RODYTI INDEKSUS IŠ lentelės_pavadinimas;

Dabar pažvelkime į visus indeksus, apibrėžtus filmų lentelėje myflixdb.

RODYTI RODYKLES IŠ „filmų“;

Vykdydami aukščiau pateiktą scenarijų „MySQL“ darbastalyje prieš „myflixdb“, gauname toliau pateiktus rezultatus.

Atminkite, kad pirminiai ir išoriniai raktai lentelėje jau buvo indeksuoti MySQL. Kiekvienas indeksas turi savo unikalų pavadinimą, taip pat rodomas stulpelis, kuriame jis apibrėžtas.

Drop indekso pagrindinė sintaksė

Nuleidimo komanda naudojama pašalinti jau apibrėžtus lentelės indeksus.

Gali būti, kad dažnai atnaujinamoje lentelėje jau nustatėte indeksą. Galbūt norėsite pašalinti tokios lentelės indeksus, kad pagerintumėte užklausų UPDATE ir INSERT našumą. Pagrindinė sintaksė, naudojama norint nuleisti rodyklę lentelėje, yra tokia.

DROP INDEX „index_id“ Į „lentelės_pavadinimas“;

Dabar pažvelkime į praktinį pavyzdį.

DROP INDEX ` full_names ` ON ` Members_indexed `;

Vykdant aukščiau pateiktą komandą, rodyklė su ID ` full_names ` pašalinama iš narių_indexed lentelės.

Santrauka

  • Indeksai yra labai galingi, kai reikia labai pagerinti MySQL paieškos užklausų našumą.
  • Indeksus galima apibrėžti kuriant lentelę arba pridėti vėliau, kai lentelė jau bus sukurta.
  • Galite apibrėžti indeksus daugiau nei viename lentelės stulpelyje.
  • SHOW INDEX FROM lentelės_pavadinimas naudojamas apibrėžtiems indeksams lentelėje rodyti.
  • Komanda DROP naudojama tam tikroje lentelėje nurodytam indeksui pašalinti.
Užduotis
Lentelės nuskaitymas per lėtas. Arba įrašų įterpimas ir atnaujinimas užtrunka per ilgai.

Sprendimas
ALTER TABLE sąlyga gali pašalinti ir pridėti ne tik stulpelius, bet ir tų stulpelių indeksus. Tokios operacijos dažnai pagerina duomenų bazės našumą. Paprastai dažnai naudojamo stulpelio indeksavimas pagreitina SELECT sakinius, nes nereikia visiškai nuskaityti lentelių. Kai kuriais atvejais indekso ištrynimas taip pat gali būti naudingas. Kai eilutė atnaujinama, MySQL turi atnaujinti visus indeksus, kuriuose yra pakeisti stulpeliai. Jei indeksą naudojate retai, tai gali reikšti, kad lentelė yra perkrauta indeksais, o pašalinus vieną iš jų gali padidėti lentelės apdorojimo efektyvumas.

Diskusija
Kad būtų lengviau naudoti, pradėkime nuo naujo mytbl testo lentelės egzemplioriaus kūrimo. Naudojame sąlygas DROP TABLE ir CREATE TABLE, kad atmestume esamą versiją ir atkurtume lentelę pradine forma:

DROP TABLE mytbl;
KURTI LENTELĘ mytbl
aš INT,
c CHAR(1)
);

Skyriaus pradžioje naudojome SHOW COLUMNS, kad stebėtume lentelės keitimo rezultatus.

Dabar mes išnagrinėsime indekso pakeitimus ir parodysime rezultatus naudodami SHOW INDEX, o ne SHOW COLUMNS. Šiuo metu lentelėje nėra indeksų, nes jie nebuvo nurodyti CREATE TABLE sakinyje:

Mysql> RODYTI RODYKLĄ IŠ mytbl;
Tuščias rinkinys (0,00 sek.)

Indeksų pridėjimas
Yra keturių tipų sąlygos, kurios į lentelę prideda indeksus:

ALTER TABLE lentelės_pavadinimas ADD PRIMARY KEY (column_list);
ALTER TABLE lentelės_pavadinimas ADD UNIQUE indekso_pavadinimas (stulpelio_sąrašas);
ALTER TABLE lentelės_pavadinimas ADD INDEX index_name (stulpelio_sąrašas);
ALTER TABLE lentelės_pavadinimas ADD FULLTEXT index_name (stulpelio_sąrašas);

Pirmoji sąlyga prideda pirminį raktą (PRIMARY KEY), tai yra, indeksuotos reikšmės turi būti unikalios ir joje neturi būti NULL. Antroji sąlyga sukuria indeksą, kurio reikšmės turi būti unikalios (išskyrus NULL reikšmes, kurios gali atsirasti kelis kartus). Trečioji sąlyga prideda įprastą indeksą, kuriame bet kuri reikšmė gali būti rodoma kelis kartus. Pastarasis sukuria specialų FULLTEXT indeksą, kuris naudojamas tekstui peržiūrėti.

Jei sakinio konstrukcijose yra indekso_vardas, jis yra neprivalomas.

Jei jo nenurodysite, MySQL automatiškai priskirs indeksui pavadinimą.

Indeksuotini stulpeliai nurodomi parametre column_list – vieno ar kelių stulpelių pavadinimų, atskirtų kableliais, sąraše.

Pažvelkime į du paprastus pavyzdžius: pirmasis sukuria vieno stulpelio indeksą c, o antrasis sukuria kelių stulpelių indeksą, apimantį c ir i:

ALTER TABLE mytbl ADD INDEX (c);
ALTER TABLE mytbl ADD INDEX (c,i);

Daugeliu atvejų indeksuojami stulpeliai turi būti paskelbti ne NULL. Pavyzdžiui, jei sukursite mytbl kaip ISAM lentelę, aukščiau pateikti ADD INDEX teiginiai nepavyks, nes ISAM lentelėse neleidžiama NULL jokiuose indeksų tipuose. Be to, PRIMARY KEY indeksuose negali būti NULL reikšmių, neatsižvelgiant į lentelės tipą. Jei bandote pridėti indeksą ir MySQL skundžiasi NULL problemomis, naudokite sąlygą ALTER TABLE, kad pakeistumėte atitinkamą (-ius) stulpelį (-ius) į ne NULL ir bandykite dar kartą sukurti indeksą. Pavyzdžiui, jei bandysite i stulpelį padaryti pirminiu raktu, atsiras klaida:

Mysql>
KLAIDA 1171 5 eilutėje: visos PIRMINIO RAKTO dalys turi būti NENULIS;
Jei rakte reikia NULL, naudokite UNIQUE

Pirmiausia turite iš naujo apibrėžti stulpelį i, kad jis neleistų NULL:

Mysql> ALTER TABLE mytbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE mytbl ADD PRIMARY KEY (i);

Viskas pavyko.

Ir pirmuoju atveju, kaip matyti iš klaidos pranešimo, vietoj pirminio rakto galite sukurti UNIKALĮ indeksą, jei indekse reikia NULL reikšmių. Indeksų pašalinimas Norėdami ištrinti indeksą, naudokite vieną iš šių sakiniai:

ALTER TABLE lentelės_pavadinimas DROP PRIMARY KEY;
ALTER TABLE lentelės_pavadinimas DROP INDEX indekso_pavadinimas;

Paprasčiausias būdas ištrinti PAGRINDINIO RAKTO indeksą, nes jums nereikia žinoti indekso pavadinimo:

ALTER TABLE mytbl DROP PRIMARY KEY;

Norėdami ištrinti indeksą, kuris nėra pagrindinis raktas, turite nurodyti jo pavadinimą. Jei nežinote, kaip indeksas vadinamas, naudokite SHOW INDEX. Norėdami išvengti per ilgų eilučių, naudokite vertikalią išvestį (\G):

Mysql> RODYTI RODYKLĄ IŠ mytbl\G
****************************** 1. eilutė ******************** * ******
Lentelė: mytbl
Ne_unikalus: 1
Key_name: c
Seq_in_index: 1
Stulpelio_pavadinimas: c
Surinkimas: A
Kardinalumas: NULL
Sub_part: NULL
Supakuota: NULL
komentaras:
****************************** 2. eilutė ************************ * ******
Lentelė: mytblNon_unique: 1
Key_name: c_2
Seq_in_index: 1
Stulpelio_pavadinimas: c
Surinkimas: A
Kardinalumas: NULL
Sub_part: NULL
Supakuota: NULL
komentaras:
****************************** 3. eilutė ************************ * ******
Lentelė: mytbl
Ne_unikalus: 1
Key_name: c_2
Seq_in_index: 2
Stulpelio_pavadinimas: i
Surinkimas: A
Kardinalumas: NULL
Sub_part: NULL
Supakuota: NULL
komentaras:

Key_name ir Seq_in_index reikšmės atitinka indeksų pavadinimus ir stulpelių pozicijas indekse. Dabar žinote, kad mytbl lentelė turi vieno stulpelio indeksą, pavadintą c, ir kelių stulpelių indeksą, pavadintą c_2 (šiuos pavadinimus MySQL pasirinko dviem indeksams, kuriuos sukūrėme anksčiau). Indeksų pašalinimo teiginys būtų toks:

ALTER TABLE mytbl DROP INDEX c, DROP INDEX c_2;

Kaip matote, viename ALTER TABLE sakinyje galima atlikti kelias operacijas, kurios turi būti atskirtos kableliais.

Lentelės indeksavimas naudojamas siekiant sutrumpinti duomenų paieškos laiką. Be indeksų paieška vyksta tiesiog surašant visas lentelės reikšmes, o tai užtrunka gana ilgai.

Mysql lentelėse naudojami šių tipų indeksai:

  • Pirminis raktas
  • Unikalus indeksas
  • Įprastas indeksas
  • Pilno teksto rodyklė

Be minėtų indeksų, jis taip pat naudojamas pilno teksto rodyklė, tačiau šiame straipsnyje apie tai nekalbama.

Pirminis raktas

Pirminis raktas naudojamas unikaliai identifikuoti įrašus lentelėje. Tarp pagrindinių punktų, susijusių su pirminiu raktu, reikėtų pažymėti:

1. lentelė negali turėti tik vieno unikalaus rakto;

2. rakto reikšmė lentelėje turi būti unikali;

3. Pirminis raktas negali būti NULL tipo.

Pirminio rakto kūrimo pavyzdys:

Pirminio rakto sukūrimas kuriant lentelę lauko aprašyme

3 pavyzdys:

Jei pirminis raktas yra teksto laukas, tada skliausteliuose turite nurodyti indeksuojant naudojamų simbolių skaičių.

5 pavyzdys:

Jei lentelė jau sukurta, galite pridėti pirminį indeksą taip.


$query = "KITAS lentelės automatinis PRIDĖTI APRIBOJIMAS PAGRINDINIS RAKTAS (id_numeris)";
$rezultatas = $ryšys->užklausa($užklausa);

?>

Įprasti ir unikalūs indeksai

Be pirminio indekso, lentelėje taip pat gali būti įprasti ir unikalūs indeksai. Skirtingai nuo pirminio indekso, šių indeksų gali būti keli. Skirtumas tarp įprasto indekso ir unikalaus indekso yra tas, kad unikalus indeksas negali turėti identiškų verčių.

Įprastų indeksų deklaravimas atliekamas naudojant raktinius žodžius Raktas arba indeksas. Jei jums reikia deklaruoti unikalų indeksą, tada anksčiau Raktas arba indeksasįdėtas raktinis žodis Unikalus.

6 pavyzdys:

Sukurkite unikalų indeksą

Indeksų pašalinimas

Indeksų pašalinimas atliekamas naudojant komandą drop index; naudojant ją, visi indeksai ištrinami.

8 pavyzdys:

$ryšys = new mysqli("localhost","root","","mybase");
$query = "automatinio indekso modelio kritimas";
$rezultatas = $ryšys->užklausa($užklausa);

?>

CREATE INDEX index_name ON Tbl_name (col_name [(ilgis)],...)

Komanda CREATE INDEX MySQL versijose, senesnėse nei 3.22, nieko nedaro. 3.22 ir naujesnėse versijose CREATE INDEX indeksų kūrimo prasme yra lygiavertė komandai ALTER TABLE. Žr. skyrių 6.5.4 ALTER TABLE pareiškimo sintaksė.

Paprastai visi indeksai sukuriami lentelėje, kai pati lentelė sukuriama naudojant komandą CREATE TABLE. Žr. skyrių 6.5.3 CREATE TABLE sakinio sintaksė. CREATE INDEX leidžia pridėti indeksus į esamas lenteles.

Formos stulpelių sąrašas (stulpelis1,stulpelis2,...) sukuria kelių stulpelių indeksą. Indekso reikšmės sudaromos sujungiant nurodytų stulpelių reikšmes.

Stulpeliams CHAR ir VARCHAR parametras col_name(length) gali sukurti indeksus, kurie naudoja tik dalį stulpelio (stulpeliams BLOB ir TEXT, turite nurodyti ilgį). Toliau pateikta komanda sukuria indeksą, naudodama pirmuosius 10 pavadinimo stulpelio simbolių:

Mysql CREATE INDEX part_of_name ON klientui (vardas (10));

Kadangi dauguma vardų paprastai skiriasi vienas nuo kito pirmaisiais 10 simbolių, šis indeksas neturėtų būti daug lėtesnis nei sukurtas iš viso vardo stulpelio. Be to, indeksams naudodami dalinius stulpelius, galite žymiai sumažinti indekso failą, o tai sutaupo vietos diske ir padidina INSERT operacijų greitį!

Atminkite, kad MySQL 3.23.2 ir naujesnėje versijoje MyISAM lentelėse galite pridėti indeksą tik stulpeliuose, kurie gali priimti NULL reikšmes, arba stulpeliuose BLOB/TEXT.

Daugiau informacijos apie tai, kaip MySQL naudoja indeksus, rasite skyriuje 5.4.3 Indeksų naudojimas MySQL.

FULLTEXT parinktis gali būti naudojama indeksuoti tik stulpelius VARCHAR ir TEXT ir tik MyISAM lentelėse. Ši funkcija pasiekiama tik MySQL 3.23.23 ir naujesnėse versijose. Žiūrėti skyrių

Indeksai naudojami norint greitai rasti eilutes su nurodyta reikšme viename stulpelyje. Be indekso, lentelė skaitoma per visą lentelę, pradedant nuo pirmojo įrašo, kol randamos atitinkamos eilutės. Kuo didesnis stalas, tuo didesnės išlaidos. Jei lentelėje yra atitinkamų stulpelių indeksas, tada MySQL gali greitai nustatyti paieškos vietą duomenų failo viduryje, neperžiūrėdamas visų duomenų. Lentelėje, kurioje yra 1000 eilučių, tai bus bent 100 kartų greičiau, palyginti su visų įrašų kartojimu paeiliui. Tačiau tuo atveju, kai reikia pasiekti beveik visas 1000 eilučių, nuoseklus skaitymas bus greitesnis, nes nereikia ieškoti disko.

Visi MySQL indeksai (PRIMARY, UNIQUE ir INDEX) yra saugomi kaip B medžiai. Stygos yra automatiškai suglaudinamos, pašalinant priešdėlį ir tarpus (žr. skyrių 6.5.7 CREATE INDEX pareiškimo sintaksė).

Indeksai naudojami:

  • Greitai raskite eilutes, atitinkančias WHERE sąlygą.
  • Atliekant sujungimus, gauti eilutes iš kitų lentelių.
  • Raskite nurodyto indeksuoto stulpelio MAX() arba MIN() reikšmes. Šią operaciją optimizuoja išankstinis procesorius, kuris patikrina, ar naudojate WHERE rakto_4 dalis = konstanta, visose sudėtinio rakto dalyse SELECT MIN(rakto_dalis2),MAX(rakto_dalis) FROM lentelės_pavadinimas, kur rakto_dalis_4 = 10
  • Atlikite rūšiavimą arba grupavimą lentelėje, jei šios operacijos atliekamos naudojant kairįjį naudojamo rakto priešdėlį (pavyzdžiui, ORDER BY key_part_1,key_part_2). Jei po visų rakto dalių yra DESC , tada raktas skaitomas atvirkštine tvarka (žr. skyrių 5.2.7 Kaip MySQL optimizuoja ORDER BY).
  • Kai kuriais atvejais užklausą galima optimizuoti, kad būtų galima gauti reikšmes nepasiekus duomenų failo. Jei tam tikroje lentelėje visi naudojami stulpeliai yra skaitiniai ir sudaro kairėje esantį tam tikro rakto priešdėlį, tada, siekiant didesnio greičio, ieškomas reikšmes galima gauti tiesiai iš indekso medžio: SELECT key_part3 FROM table_name WHERE key_part1=1

Tarkime, kad toks SELECT sakinys vadinamas:

Mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

Jei stulpeliuose col1 ir 2 yra kelių stulpelių indeksas, atitinkamas eilutes galima pasirinkti tiesiogiai. Tuo atveju, kai stulpeliuose col1 ir col2 yra atskiri indeksai, optimizavimo priemonė bando rasti labiausiai ribojantį indeksą, nustatydama, kuris indeksas randa mažiausiai eilučių, ir naudoja tą indeksą toms eilutėms gauti.

Jei tam tikroje lentelėje yra kelių stulpelių indeksas, optimizatorius gali naudoti bet kurį to indekso priešdėlį kairėje, kad surastų eilutes. Pavyzdžiui, jei turite indeksą trijuose stulpeliuose (1 stulpelis, 2 stulpelis, 3 stulpelis), galite atlikti indeksuotas paieškas (stulpelis1), (stulpelis1, stulpelis2) ir (stulpelis1, stulpelis2, 3 stulpelis).

MySQL negalite naudoti dalinio indekso, nebent stulpeliai sudaro kairįjį to indekso priešdėlį. Tarkime, kad turite toliau pateiktas SELECT komandas:

Mysql> SELECT * FROM tbl_name WHERE col1=val1; mysql> SELECT * FROM tbl_name WHERE col2=val2; mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

Jei indeksas yra (stulpelis1,stulpelis2,stulpelis3), tik pirmiau parodytoje užklausoje naudojamas šis indeksas. Antroji ir trečioji užklausos apima indeksuotus stulpelius, tačiau (stulpelis2) ir (stulpelis2,stulpelis3) nėra kairioji (col1,col2,col3) priešdėlių dalis.

MySQL taip pat naudoja indeksus LIKE palyginimams, jei LIKE išraiškos argumentas yra pastovi eilutė, kuri neprasideda pakaitos simboliu. Pavyzdžiui, šios SELECT komandos naudoja indeksus:

Mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Patrick%"; mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Pat%_ck%";

Pirmoji komanda žiūri tik į eilutes su "Patrick"

Šios SELECT komandos nenaudos indeksų:

Mysql> SELECT * FROM tbl_name WHERE key_col LIKE "% Patrick%"; mysql> SELECT * FROM tbl_name WHERE key_col LIKE other_col;

Pirmoje komandoje LIKE reikšmė prasideda pakaitos simboliu. Antroje komandoje LIKE reikšmė nėra konstanta.

MySQL 4.0 pristato kitokį LIKE išraiškos optimizavimą. Jei naudojama išraiška... LIKE "%string%", o eilutės ilgis yra didesnis nei 3 simboliai, tada MySQL naudos Turbo Boyer-Moore algoritmą, kad inicijuotų eilutės šabloną, o tada naudos tą šabloną paieška greičiau.

Ieškant naudojant stulpelio_pavadinimas IS NULL, indeksai bus naudojami, jei stulpelio_pavadinimas yra indeksas.

MySQL paprastai naudoja indeksą, kuris randa mažiausiai eilučių. Indeksas naudojamas stulpeliuose, kurie lyginami naudojant šiuos operatorius: =, >, >=,

Jei indeksas neapima visų WHERE sąlygoje esančių AND lygių, jis nenaudojamas užklausai optimizuoti. Kitaip tariant, kad indeksą būtų galima naudoti, to indekso priešdėlis turi būti kiekvienoje grupėje IR.

Šiose WHERE sąlygose naudojami indeksai:

WHERE index_part1=1 AND index_part2=2 AND other_column=3 ... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */ ... WHERE index_part1="labas" AND index_part_3= 5 /* optimizuota kaip "index_part1="hello" */ ... WHERE index1=1 ir index2=2 arba index1=3 ir index3=3; /* Galite naudoti indeksą indekse 1, bet ne indekse 2 ar 3 */

Toliau pateikiamos WHERE sąlygos Ne naudoti indeksus:

WHERE index_part2=1 AND index_part3=2 /* index_part_1 nenaudoja =10 /* Nėra indekso, apimančio visas eilutes*/

Kai kuriais atvejais MySQL nenaudoja indekso, nors tai įmanoma. Toliau pateikiami keli tokių situacijų pavyzdžiai:

  • Jei naudojant indeksą reikia, kad MySQL pereitų daugiau nei 30 % tam tikros lentelės eilučių (tokiais atvejais lentelės perėjimas greičiausiai bus daug greitesnis, nes reikės mažiau peržvalgų). Atminkite, kad jei tokioje užklausoje LIMIT naudojamas tik gaunamų eilučių poaibyje, MySQL vis tiek naudos indeksą, nes nedidelį skaičių eilučių galima rasti daug greičiau, kad būtų pateiktas rezultatas.
  • Jei indekso pakeitimo diapazone gali būti NULL reikšmės, kai naudojamos ORDER BY ... DESC išraiškos.