mysql index típusok. Hogyan használjunk egyedi indexeket a MySQL-ben. Az indexek használatának hátrányai

Feladat
A táblázat vizsgálata túl lassú. Vagy a rekordok beszúrása és frissítése túl sokáig tart.

Megoldás
Az ALTER TABLE záradék nemcsak oszlopokat, hanem indexeket is eltávolíthat és hozzáadhat ezekhez az oszlopokhoz. Az ilyen műveletek gyakran javítják az adatbázis teljesítményét. Általában egy gyakran használt oszlop indexelése felgyorsítja a SELECT utasításokat, mivel nem kell teljesen átvizsgálnia a táblákat. Bizonyos esetekben az index törlése is előnyös lehet. Amikor egy sor frissül, a MySQL-nek frissítenie kell a megváltozott oszlopokat tartalmazó összes indexet. Ha ritkán használ indexet, ez azt jelezheti, hogy a tábla túl van terhelve indexekkel, és az egyik eltávolítása javíthatja a táblafeldolgozás hatékonyságát.

Vita
A könnyebb használat érdekében kezdjük a mytbl teszttábla új példányának létrehozásával. A DROP TABLE és a CREATE TABLE záradékot használjuk a meglévő verzió eldobásához és a táblázat eredeti formájában történő újrateremtéséhez:

DROP TABLE mytbl;
TÁBLÁZAT LÉTREHOZÁSA mytbl
én INT,
c CHAR(1)
);

A fejezet elején az OSZLOPOK MUTATÁSA segítségével figyeltük a táblázat megváltoztatásának eredményét.

Most megvizsgáljuk az index változásait, és az eredményeket az INDEX SHOW COLUMNS helyett a SHOW COLUMNS használatával jelenítjük meg. Jelenleg nincsenek indexek a táblán, mert nem voltak megadva a CREATE TABLE utasításban:

Mysql> INDEX MUTATÁSA A mytbl-ből;
Üres készlet (0,00 mp)

Indexek hozzáadása
Négy típusú kitétel létezik, amelyek indexeket adnak a táblázathoz:

ALTER TABLE táblanév ADD PRIMARY KEY (oszlop_lista);
ALTER TABLE táblanév ADD EGYEDI indexnév (oszloplista);
ALTER TABLE táblanév ADD INDEX indexnév (oszloplista);
ALTER TABLE táblanév ADD TELJESSZÖVEG indexnév (oszloplista);

Az első záradék egy elsődleges kulcsot (PRIMARY KEY) ad hozzá, vagyis az indexelt értékeknek egyedinek kell lenniük, és nem tartalmazhatnak NULL értéket. A második záradék egy indexet hoz létre, amelyhez az értékeknek egyedinek kell lenniük (kivéve a NULL értékeket, amelyek többször is előfordulhatnak). A harmadik záradék egy szabályos indexet ad hozzá, amelyben bármely érték többször is megjelenhet. Ez utóbbi egy speciális TELJESSZÖVEG indexet hoz létre, amely a szöveg megtekintésére szolgál.

Ha van index_name a mondatszerkezetekben, akkor ez nem kötelező.

Ha nem adja meg, a MySQL automatikusan nevet rendel az indexhez.

Az indexelendő oszlopok a column_list paraméterben vannak megadva – egy vagy több oszlopnév listája, vesszővel elválasztva.

Nézzünk két egyszerű példát: az első egy egyoszlopos indexet hoz létre c-n, a második pedig egy többoszlopos indexet, amely tartalmazza a c-t és az i-t:

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

Sok esetben az indexelt oszlopokat nem NULL-ként kell deklarálni. Például, ha a mytbl-t ISAM-táblaként hozza létre, a fenti ADD INDEX utasítások sikertelenek lesznek, mert az ISAM-táblák nem engedélyezik a NULL-t egyetlen indextípusban sem. Ezenkívül az ELSŐDLEGES KULCS indexei a tábla típusától függetlenül nem tartalmazhatnak NULL értékeket. Ha indexet próbál hozzáadni, és a MySQL NULL problémákra panaszkodik, az ALTER TABLE záradékkal módosítsa a vonatkozó oszlop(oka)t nem NULL-ra, és próbálja meg újra létrehozni az indexet. Például, ha megpróbálja az i oszlopot elsődleges kulccsá tenni, hiba történik:

Mysql>
1171-es HIBA az 5. sorban: AZ ELSŐDLEGES KULCS minden része NEM lehet NULL;
Ha egy kulcsban NULL-t kell megadni, használja helyette az UNIQUE-t

Először újra kell definiálnia az i oszlopot, hogy ne engedélyezze a NULL-t:

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

Minden sikerült.

És az első esetben, amint az a hibaüzenetből látható, az elsődleges kulcs helyett létrehozhat egy EGYEDI indexet, ha NULL értékekre van szüksége az indexben. Indexek eltávolítása Az index törléséhez használja az alábbiak egyikét mondatok:

TÁBLÁZAT MÓDOSÍTÁSA táblázat_neve DROP PRIMARY KEY;
ALTER TABLE táblanév DROP INDEX indexnév;

Az ELSŐDLEGES KULCS index törlésének legegyszerűbb módja, mert nem kell tudnia az index nevét:

ALTER TABLE mytbl DROP PRIMARY KEY;

Olyan index törléséhez, amely nem elsődleges kulcs, meg kell adni a nevét. Ha nem tudja, mi az index neve, használja a SHOW INDEX lehetőséget. A túl hosszú sorok kiírásának elkerülése érdekében használjon függőleges kimenetet (\G):

Mysql> INDEX MUTATÁSA A mytbl\G-ből
****************************** 1. sor ******************** * ******
Táblázat: mytbl
Nem_egyedi: 1
Key_name: c
Seq_in_index: 1
Oszlop_neve: c
Összeállítás: A
Kardinalitás: NULL
Al_rész: NULL
Csomagolás: NULL
Megjegyzés:
****************************** 2. sor ******************** * ******
Táblázat: mytblNon_unique: 1
Kulcs_neve: c_2
Seq_in_index: 1
Oszlop_neve: c
Összeállítás: A
Kardinalitás: NULL
Al_rész: NULL
Csomagolás: NULL
Megjegyzés:
****************************** 3. sor ******************** * ******
Táblázat: mytbl
Nem_egyedi: 1
Kulcs_neve: c_2
Seq_in_index: 2
Oszlopnév: i
Összeállítás: A
Kardinalitás: NULL
Al_rész: NULL
Csomagolás: NULL
Megjegyzés:

A Key_name és Seq_in_index értékek megfelelnek az indexek nevének és az oszlopok pozícióinak az indexben. Most már tudja, hogy a mytbl táblának van egy c nevű egyoszlopos indexe és egy c_2 nevű többoszlopos indexe (ezeket a neveket a MySQL választotta a korábban létrehozott két indexhez). Az indexeket eltávolító utasítás a következő lenne:

ALTER TABLE mytbl DROP INDEX c, DROP INDEX c_2;

Mint látható, egy ALTER TABLE utasításban több művelet is végrehajtható, amelyeket vesszővel kell elválasztani.

A táblázatos indexelést az adatkeresési idő csökkentésére használják. Indexek nélkül a keresés az összes táblaérték egyszerű felsorolásával történik, ami meglehetősen hosszú időt vesz igénybe.

A következő típusú indexeket használják a mysql táblákban:

  • Elsődleges kulcs
  • Egyedi index
  • Rendszeres index
  • Teljes szöveges index

A fenti indexeken kívül azt is használják teljes szöveges index, de ez a cikk nem tárgyalja.

Elsődleges kulcs

Az elsődleges kulcs a tábla rekordjainak egyedi azonosítására szolgál. Az elsődleges kulccsal kapcsolatos főbb pontok között meg kell jegyezni a következőket:

1. egy táblának nem lehet csak egy egyedi kulcsa;

2. a kulcs értékének egyedinek kell lennie a táblán belül;

3. Az elsődleges kulcs nem lehet NULL típusú.

Példa elsődleges kulcs létrehozására:

Elsődleges kulcs létrehozása táblázat létrehozásakor a mezőleírásban

3. példa:

Ha az elsődleges kulcs egy szövegmező, akkor zárójelben kell megadnia az indexelésben részt vevő karakterek számát.

5. példa:

Ha a tábla már létrejött, akkor a következőképpen adhat hozzá egy elsődleges indexet.


$query = "ALTER table auto ADD CONSTRAINT PRIMARY KEY (id_number)";
$eredmény = $kapcsolat->lekérdezés($query);

?>

Rendszeres és egyedi indexek

A tábla az elsődleges indexen kívül tartalmazhat szabályos és egyedi indexeket is. Az elsődleges indextől eltérően több ilyen index is lehet. A szokásos index és az egyedi index között az a különbség, hogy egy egyedi indexnek nem lehet azonos értéke.

A szabályos indexek deklarálása kulcsszavak használatával történik kulcs vagy index. Ha egyedi indexet kell deklarálnia, akkor előtte kulcs vagy index a kulcsszó kerül egyedi.

6. példa:

Hozzon létre egy egyedi indexet

Indexek eltávolítása

Az indexek eltávolítása a drop index paranccsal történik, az összes index törlődik.

8. példa:

$kapcsolat = new mysqli("localhost","root","","mybase");
$query = "drop index model on auto";
$eredmény = $kapcsolat->lekérdezés($query);

?>

lábléc a word 2007-ben, 0000002111

Indexek használata MySQL-ben

Az indexek segítségével gyorsan megtalálhatja a megadott értékű sorokat egy oszlopban. Index nélkül a tábla a teljes táblát végigolvassa az első rekordtól kezdve, amíg meg nem találja a megfelelő sorokat. Minél nagyobb az asztal, annál nagyobb a rezsi. Ha a táblázat indexet tartalmaz a kérdéses oszlopokon, akkor a MySQL gyorsan meg tudja határozni a keresési pozíciót az adatfájl közepén anélkül, hogy minden adaton átmenne. Egy 1000 sorból álló tábla esetén ez legalább 100-szor gyorsabb lesz, mint az összes rekord egymás utáni ismétlése. Abban az esetben azonban, ha majdnem mind az 1000 sort el kell érni, a szekvenciális olvasás gyorsabb lesz, mivel nincs szükség lemezkeresésre.

Minden MySQL index (PRIMARY, UNIQUE és INDEX) B-faként van tárolva. A karakterláncok automatikusan tömörítésre kerülnek, eltávolítva az előtagokat és a záró szóközöket.

Az indexeket a következőkre használják:

    Gyorsan megtalálhatja a WHERE záradéknak megfelelő sorokat.

    Sorok lekérése más táblákból az összeillesztések végrehajtásakor.

    Keresse meg egy adott indexelt oszlop MAX() vagy MIN() értékét. Ezt a műveletet az előfeldolgozó optimalizálja, amely ellenőrzi, hogy nem WHERE kulcs_rész_4 = állandót használ-e az összetett kulcs minden részén< N . В этом случае MySQL сделает один просмотр ключа и заменит выражение константой MIN() . Если все выражения заменяются константой, запрос моментально вернет результат:

    SELECT MIN(kulcs_rész2),MAX(kulcs_rész2) FROM táblázat_neve ahol kulcs_rész1=10

    Végezze el a rendezést vagy csoportosítást egy táblázatban, ha ezeket a műveleteket a használt kulcs bal szélső előtagján hajtja végre (például ORDER BY kulcs_rész_1, kulcs_rész_2). Ha egy kulcs minden részét a DESC követi, akkor a kulcs fordított sorrendben kerül beolvasásra

    Egyes esetekben a lekérdezés optimalizálható úgy, hogy az adatfájlhoz való hozzáférés nélkül is lekérjen értékeket. Ha egy táblázatban az összes használt oszlop numerikus, és valamelyik kulcshoz a bal szélső előtagot alkotja, akkor a nagyobb sebesség érdekében a keresendő értékek közvetlenül az indexfából kinyerhetők:

    SELECT key_part3 FROM table_name WHERE key_part1=1

Tegyük fel, hogy a következő SELECT utasítást hívják:

Mysql> SELECT * FROM tbl_name WHERE col1=érték1 ÉS col2=érték2;

Ha a col1 és col2 oszlopokon több oszlopos index található, akkor a megfelelő sorok közvetlenül kijelölhetők. Abban az esetben, ha a col1 és col2 oszlopokon külön indexek találhatók, az optimalizáló megpróbálja megtalálni a leginkább korlátozó indexet úgy, hogy meghatározza, melyik index találja a legkevesebb sort, és ezt az indexet használja a sorok lekérésére.

Ha egy adott táblának többoszlopos indexe van, akkor az index bármely bal szélső előtagját felhasználhatja az optimalizáló sorok keresésére. Például, ha van egy indexe három oszlopon (1. oszlop, 2. oszlop, 3. oszlop), akkor lehetőség van indexelt keresésekre az (1. oszlop), (1. oszlop, 2. oszlop) és (1. oszlop,2. oszlop3. oszlop) indexelése.

A MySQL-ben nem használhat részleges indexet, hacsak az oszlopok nem képezik az index bal szélső előtagját. Tegyük fel, hogy az alábbi SELECT parancsokkal rendelkezik:

Mysql> SELECT * FROM tbl_name WHERE col1=érték1; mysql> SELECT * FROM tbl_name WHERE col2=érték2; mysql> SELECT * FROM tbl_name WHERE col2=érték2 ÉS col3=érték3;

Ha létezik index a (col1,col2,col3), akkor csak a fent látható első lekérdezés használja ezt az indexet. A második és harmadik lekérdezés tartalmaz indexelt oszlopokat, de a (col2) és (col2,col3) nem a (col1,col2,col3) előtagok bal szélső része.

A MySQL indexeket is használ a LIKE összehasonlításhoz, ha a LIKE kifejezés argumentuma egy állandó karakterlánc, amely nem helyettesítő karakterrel kezdődik. Például a következő SELECT parancsok indexeket használnak:

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

Az első parancs csak a "Patrick" betűs sorokat nézi<= key_col < "Patricl" , а во второй - только строки с "Pat" <= key_col < "Pau" .

A következő SELECT parancsok nem használnak indexeket:

Mysql> SELECT * FROM tbl_name WHERE key_col LIKE "%Patrick%"; mysql> SELECT * FROM tbl_name WHERE kulcs_col LIKE másik_col;

Az első parancsban a LIKE érték helyettesítő karakterrel kezdődik. A második parancsban a LIKE érték nem állandó.

A MySQL 4.0 egy másik optimalizálást vezet be a LIKE kifejezésre. Ha a... LIKE "%string%" kifejezést használjuk, és a karakterlánc hossza meghaladja a 3 karaktert, akkor a MySQL a Turbo Boyer-Moore algoritmust használja a karakterlánc mintájának inicializálására, majd ezt a mintát használja. gyorsabb a keresés.

Ha az oszlopnév IS NULL értékkel keresünk, akkor az indexeket használja a rendszer, ha az oszlopnév index.

A MySQL általában azt az indexet használja, amelyik a legkevesebb sort találja. Az index olyan oszlopokon használatos, amelyek összehasonlítása a következő operátorokkal történik: =, >, >=,<, <=, BETWEEN и LIKE с префиксом, не содержащим шаблонного символа, такого как something% .

Ha egy index nem fedi le a WHERE záradék összes ÉS szintjét, akkor nem használja a lekérdezés optimalizálására. Más szóval: ahhoz, hogy egy index használható legyen, az index előtagjának meg kell jelennie minden ÉS csoportban.

A következő WHERE záradékok indexeket használnak:

WHERE index_part1=1 AND index_part2=2 AND other_column=3 ... WHERE index=1 VAGY A=10 ÉS index=2 /* index = 1 VAGY index = 2 */ ... WHERE index_part1="hello" AND index_part_3= 5 /* optimalizálva: "index_part1="hello"" */ ... WHERE index1=1 és index2=2 vagy index1=3 és index3=3; /* Használhat indexet az index1-nél, de nem az index2-nél vagy a 3-as indexnél */

A következő WHERE záradékok Nem használj indexeket:

WHERE index_part2=1 AND index_part3=2 /* index_part_1 nincs használatban */ ... WHERE index=1 VAGY A=10 /* Az index nem használatos az AND mindkét részében */ ... WHERE index_part1=1 OR index_part2 =10 /* Nincs minden sort lefedő index*/

Egyes esetekben a MySQL nem használ indexet, bár lehetséges. Az alábbiakban néhány példát mutatunk be ilyen helyzetekre:

    Ha egy index használatához a MySQL-nek egy adott tábla sorainak több mint 30%-át kell bejárnia (ilyen esetekben a tábla bejárása valószínűleg sokkal gyorsabb lesz, mivel kevesebb keresésre lesz szükség). Vegye figyelembe, hogy ha egy ilyen lekérdezés csak a beolvasott sorok részhalmazán használja a LIMIT értéket, akkor a MySQL mindenképpen használja az indexet, mivel kis számú sor sokkal gyorsabban visszaadható.

Oszlopindexek

A MySQL-ben minden típusú oszlop indexelhető. Indexek használata a releváns oszlopokon jó módszer a SELECT műveletek felgyorsítására.

A kulcsok maximális számát és az indexek maximális hosszát a táblázatmotor határozza meg. Legalább 16 kulccsal rendelkezhet az összes táblamotorban, és az index teljes hossza legalább 256 bájt.

A CHAR és VARCHAR oszlopok esetében indexelheti az oszlop előtagját. Ez sokkal gyorsabb és kevesebb lemezterületet igényel, mint a teljes oszlop indexelése. A CREATE TABLE parancsban az oszlopelőtag indexeléséhez használt szintaxis a következő:

KEY index_neve (oszlopnév(hossz))

A következő példa indexet hoz létre a név oszlop első 10 karakterén:

Mysql> TÁBLÁZAT LÉTREHOZÁSA teszt ( -> név CHAR(200) NOT NULL, -> KEY index_name(név(10)));

A BLOB és TEXT oszlopok esetén az oszlop előtagját indexelni kell. Nem indexelhet egy teljes oszlopot.

A MySQL 3.23.23 és újabb verzióiban egyéni FULLTEXT indexeket is létrehozhat. Teljes szöveges kereséshez használják őket. A FULLTEXT teljes szövegű indexek csak a MyISAM táblákat támogatják. Csak a VARCHAR és a TEXT oszlopokon hozhatók létre. Az indexelés mindig a teljes oszlopon történik, és a részleges indexelés nem támogatott.

Többoszlopos indexek

A MySQL több oszlopon is képes indexeket létrehozni. Egy index legfeljebb 15 oszlopot tartalmazhat (a CHAR és VARCHAR oszlopokon az oszlop előtagját is használhatja az index részeként)

A többoszlopos index felfogható egy rendezett tömbnek, amely az indexelt oszlopok értékeinek összefűzésével létrehozott értékeket tartalmaz.

A MySQL többoszlopos indexeket használ oly módon, hogy a lekérdezések gyorsan lefutnak, amikor megadja az index első oszlopának ismert részét a WHERE záradékban, még akkor is, ha nem ad meg értékeket a többi oszlophoz.

Tegyük fel, hogy létrejön a következő táblázat:

Mysql> TÁBLÁZAT LÉTREHOZÁSA teszt ( -> azonosító INT NOT NULL, -> vezetéknév CHAR(30) NOT NULL, -> keresztnév CHAR(30) NOT NULL, -> ELSŐDLEGES KULCS (azonosító), -> INDEX név (last_name,first_name));

A névindex a vezetéknév és a keresztnév oszlopok indexe. Ezt az indexet azokhoz a lekérdezésekhez használják, amelyek értéket adnak meg az ismert régióban a last_name vagy a last_name és a first_name oszlopokban. Így a névindex a következő lekérdezésekben lesz használva:

Mysql> SELECT * FROM teszt WHERE last_name="Widenius"; mysql> -> ÉS first_name="Michael"; mysql> SELECT * FROM teszt WHERE last_name="Widenius" -> ÉS (first_name="Michael" VAGY first_name="Monty"); mysql> SELECT * FROM teszt WHERE last_name="Widenius" -> ÉS keresztnév >="M" ÉS utónév< "N";

Ha többet szeretne tudni arról, hogy a MySQL hogyan használja az indexeket a lekérdezés teljesítményének javítására,

Táblázatok megnyitása és bezárása MySQL-ben

A table_cache, max_connections és max_tmp_tables paraméterek meghatározzák a kiszolgáló által nyitva tartott fájlok maximális számát. Ha növeli az egyik vagy mindkét paramétert, előfordulhat, hogy az operációs rendszer korlátozza a folyamatonként megnyitott fájlleírók számát. Sok rendszerben azonban ez a határ növelhető. Mivel ennek az értéknek a megváltoztatása rendszerenként változhat, minden egyes esetre tekintse át az operációs rendszer dokumentációját.

A table_cache és a max_connections értékek összefüggenek. Például 200 egyidejű kapcsolat esetén legalább 200 * n méretű táblázat-gyorsítótárral kell rendelkeznie, ahol n a kapcsolódó táblák maximális száma. Ezenkívül le kell foglalnia néhány további fájlleírót az ideiglenes táblákhoz és fájlokhoz.

Győződjön meg arról, hogy operációs rendszere képes kezelni a table_cache beállítás által feltételezett megnyitott fájlleírók számát. Ha a table_cache értéke túl magas, a MySQL kifogyhat a fájlleírókból, megszakíthatja a kapcsolatot, meghiúsulhat a lekérdezések, és nagyon megbízhatatlanná válhat. Azt is figyelembe kell vennie, hogy a MyISAM táblamotor két fájlleírót igényel minden egyedi nyitott táblához. A MySQL által engedélyezett fájlleírók száma az --open-files-limit=# indítási opcióval növelhető.

A megnyitott tábla gyorsítótárában a táblák maximális száma a table_cache paraméterben megadott szám lesz (alapértelmezett 64; ez a szám módosítható a mysqld -O table_cache=# beállításával). Kérjük, vegye figyelembe, hogy a MySQL ideiglenesen további táblákat nyithat meg lekérdezések végrehajtásához.

A nem használt táblákat a következő helyzetekben bezárjuk és eltávolítjuk a tábla gyorsítótárából:

    Amikor a gyorsítótár megtelt, és a szál megpróbál megnyitni egy olyan táblát, amely nincs ebben a gyorsítótárban.

    Ha a gyorsítótár több mint table_cache bemeneti értéket tartalmaz, és a szál már nem használja a táblázatot.

    Amikor valaki futtatja a mysqladmin refresh vagy mysqladmin flush-tables .

    Amikor valaki végrehajtja a FLUSH TABLES parancsot.

Amikor a táblázat gyorsítótára megtelik, a szerver a következő eljárást alkalmazza a gyorsítótár-bemenetek felhasználásra történő kiosztására:

    A jelenleg nem használt táblázatok a legrégebbi használat sorrendjében szabadulnak fel.

    Ha a gyorsítótár megtelt, és egyetlen tábla sem szabadítható fel, és új táblát kell nyitni, a gyorsítótár ideiglenesen kibővül, amennyire szükséges.

    Ha a gyorsítótár ideiglenesen kibővített állapotban van, és egy tábla átvált egy használt állapotból egy használaton kívüli állapotba, a tábla bezárul, és felszabadul a gyorsítótárból.

A táblázat minden egyidejű hozzáféréshez megnyílik. Ez azt jelenti, hogy ha két szál fér hozzá ugyanahhoz a táblához, vagy ha ugyanazt a táblát kétszer éri el ugyanabban a lekérdezésben (AS használatával), akkor a táblát kétszer kell megnyitni. Bármely tábla első megnyitásához két fájlleíró szükséges; minden további használathoz csak egy. Az indexfájlhoz egy további első megnyitási fogantyú használatos; ezt a fogantyút minden szál megosztja.

Amikor megnyit egy táblát a HANDLER táblanév OPEN paranccsal, egy dedikált táblaobjektum jön létre az adott szálhoz. Ez a táblaobjektum nem érhető el más szálak számára, és nem záródik be mindaddig, amíg a szál ki nem adja a HANDLER tábla_neve CLOSE parancsot, vagy magát a szálat meg nem szüntetik. Ha ez megtörténik, a tábla visszakerül a tábla gyorsítótárába (ha nincs tele).

Ha látni szeretné, hogy a tábla gyorsítótára túl kicsi-e, ellenőrizze az Opened_tables változót. Ha az érték elég nagy, még ha nem is futtatta túl gyakran a FLUSH TABLES parancsot, akkor növelnie kell a tábla gyorsítótárát.

fejlécek és láblécek a Word 2007-ben, 000000211111

Az indexek segítségével gyorsan megtalálhatja a megadott értékű sorokat egy oszlopban. Index nélkül a tábla a teljes táblát végigolvassa, az első rekordtól kezdve, amíg meg nem találja a megfelelő sorokat. Minél nagyobb az asztal, annál nagyobb a rezsi. Ha a táblázat indexet tartalmaz a kérdéses oszlopokon, akkor a MySQL gyorsan meg tudja határozni a keresési pozíciót az adatfájl közepén anélkül, hogy minden adaton átmenne. Egy 1000 sorból álló tábla esetén ez legalább 100-szor gyorsabb lesz, mint az összes rekord egymás utáni ismétlése. Abban az esetben azonban, ha majdnem mind az 1000 sort el kell érni, a szekvenciális olvasás gyorsabb lesz, mivel nincs szükség lemezkeresésre.

Az összes MySQL index (PRIMARY, UNIQUE és INDEX) B-faként van tárolva. A karakterláncok automatikusan tömörítésre kerülnek, eltávolítva az előtagot és a záró szóközt (lásd: 6.5.7 INDEX Utasítás szintaxisának létrehozása).

Az indexeket a következőkre használják:

  • Gyorsan megtalálhatja a WHERE záradéknak megfelelő sorokat.
  • Sorok lekérése más táblákból az összeillesztések végrehajtásakor.
  • Keresse meg egy adott indexelt oszlop MAX() vagy MIN() értékét. Ezt a műveletet egy előfeldolgozó optimalizálja, amely ellenőrzi, hogy használja-e WHERE kulcs_rész_4 = állandó, az összetett kulcs minden részén . Ebben az esetben a MySQL egyszer megkeresi a kulcsot, és lecseréli a kifejezést a MIN() konstansra. Ha minden kifejezést konstansra cserélünk, a lekérdezés azonnal visszaadja az eredményt: SELECT MIN(kulcs_rész2),MAX(kulcs_rész2) FROM táblanév ahol kulcs_rész1=10
  • Végezzen rendezést vagy csoportosítást egy táblázaton, ha ezeket a műveleteket a használt kulcs bal szélső előtagján hajtja végre (pl. ORDER BY kulcs_rész_1,kulcs_rész_2). Ha egy kulcs minden részét a DESC követi, akkor a kulcs fordított sorrendben kerül beolvasásra (lásd: 5.2.7 Hogyan optimalizálja a MySQL ORDER BY részt).
  • Egyes esetekben a lekérdezés optimalizálható úgy, hogy az adatfájlhoz való hozzáférés nélkül is lekérjen értékeket. Ha egy adott táblázatban az összes használt oszlop numerikus és egy adott kulcs bal szélső előtagját alkotja, akkor a nagyobb sebesség érdekében a keresett értékek közvetlenül az indexfából is lekérhetők: SELECT kulcs_rész3 FROM tábla_neve WHERE kulcs_rész1=1

Tegyük fel, hogy a következő SELECT utasítást hívják:

Mysql> SELECT * FROM tbl_name WHERE col1=érték1 ÉS col2=érték2;

Ha az 1. és 2. oszlopban többoszlopos index található, akkor a megfelelő sorok közvetlenül kijelölhetők. Abban az esetben, ha a col1 és col2 oszlopokon külön indexek találhatók, az optimalizáló megpróbálja megtalálni a leginkább korlátozó indexet úgy, hogy meghatározza, melyik index találja a legkevesebb sort, és ezt az indexet használja a sorok lekérésére.

Ha egy adott táblának többoszlopos indexe van, akkor ennek az indexnek a bal szélső előtagját használhatja az optimalizáló sorok keresésére. Például, ha van egy indexe három oszlopon (1. oszlop, 2. oszlop, 3. oszlop), akkor lehetőség van az indexelt keresésekre az (1. oszlop), (1. oszlop,2. oszlop) és (1. oszlop,2. oszlop3. oszlop) indexelt keresése.

A MySQL-ben nem használhat részleges indexet, hacsak az oszlopok nem képezik az index bal szélső előtagját. Tegyük fel, hogy az alábbi SELECT parancsokkal rendelkezik:

Mysql> SELECT * FROM tbl_name WHERE col1=érték1; mysql> SELECT * FROM tbl_name WHERE col2=érték2; mysql> SELECT * FROM tbl_name WHERE col2=érték2 ÉS col3=érték3;

Ha létezik index a (col1,col2,col3), akkor csak a fent látható első lekérdezés használja ezt az indexet. A második és harmadik lekérdezés tartalmaz indexelt oszlopokat, de a (col2) és (col2,col3) nem a (col1,col2,col3) előtagok bal szélső része.

A MySQL indexeket is használ a LIKE-összehasonlításokhoz, ha a LIKE kifejezés argumentuma egy állandó karakterlánc, amely nem helyettesítő karakterrel kezdődik. Például a következő SELECT parancsok indexeket használnak:

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

Az első parancs csak a -vel rendelkező sorokat nézi "Patrick" , a másodikban pedig csak a "Pat" sorok.

A következő SELECT parancsok nem használnak indexeket:

Mysql> SELECT * FROM tbl_name WHERE key_col LIKE "%Patrick%"; mysql> SELECT * FROM tbl_name WHERE kulcs_col LIKE másik_col;

Az első parancsban a LIKE érték helyettesítő karakterrel kezdődik. A második parancsban a LIKE érték nem állandó.

A MySQL 4.0 egy másik optimalizálást vezet be a LIKE kifejezésre. Ha a ... LIKE "%string%" kifejezést használjuk, és a karakterlánc hossza meghaladja a 3 karaktert, akkor a MySQL a Turbo Boyer-Moore algoritmus segítségével inicializálja a karakterlánc mintáját, majd ezt a mintát használja. gyorsabb a keresés.

Ha az oszlopnév IS NULL értékkel keresünk, akkor az indexeket használja a rendszer, ha az oszlopnév index.

A MySQL általában azt az indexet használja, amelyik a legkevesebb sort találja. A következő operátorokkal összehasonlított oszlopokon indexet használnak: =, >, >= és LIKE olyan előtaggal, amely nem tartalmaz helyettesítő karaktert, például valami% .

Ha egy index nem fedi le a WHERE záradék összes ÉS szintjét, akkor nem használja a lekérdezés optimalizálására. Más szóval: ahhoz, hogy egy index használható legyen, az index előtagjának meg kell jelennie minden ÉS csoportban.

A következő WHERE záradékok indexeket használnak:

WHERE index_part1=1 AND index_part2=2 AND other_column=3 ... WHERE index=1 VAGY A=10 ÉS index=2 /* index = 1 VAGY index = 2 */ ... WHERE index_part1="hello" AND index_part_3= 5 /* optimalizálva: "index_part1="hello"" */ ... WHERE index1=1 és index2=2 vagy index1=3 és index3=3; /* Használhat indexet az index1-nél, de nem az index2-nél vagy a 3-as indexnél */

A következő WHERE záradékok Nem használj indexeket:

WHERE index_part2=1 AND index_part3=2 /* index_part_1 nincs használatban */ ... WHERE index=1 VAGY A=10 /* Az index nem használatos az AND mindkét részében */ ... WHERE index_part1=1 OR index_part2 =10 /* Nincs minden sort lefedő index*/

Egyes esetekben a MySQL nem használ indexet, bár lehetséges. Az alábbiakban néhány példát mutatunk be ilyen helyzetekre:

  • Ha egy index használatához a MySQL-nek egy adott tábla sorainak több mint 30%-át kell bejárnia (ilyen esetekben a tábla bejárása valószínűleg sokkal gyorsabb lesz, mivel kevesebb keresésre lesz szükség). Vegye figyelembe, hogy ha egy ilyen lekérdezés csak a beolvasott sorok részhalmazán használja a LIMIT értéket, akkor a MySQL mindenképpen használja az indexet, mivel kis számú sor sokkal gyorsabban visszaadható.
  • Ha az index változási tartománya NULL értékeket tartalmazhat az ORDER BY ... DESC kifejezések használatakor.


Ha bármilyen más kérdése van, vagy valami nem világos, üdvözöljük oldalunkon

A korábbi cikkekben gyakran említettem indexek a MySQL-ben. és megígértem, hogy hamarosan mesélek róluk. Tehát eljött ez az idő, és ma megtudhatod MySQL indexek, a céljukról és a létrehozásuk módjáról.

Az indexek az adatbázistáblákból való adatlehívás felgyorsítására szolgálnak. Valójában, index a MySQL-ben- ez egy adott mező rendezése egy táblázatban. Ez azt jelenti, hogy ha egy mezőt indexmé teszünk, akkor a teljes tábla e mező szerint lesz rendezve. Miért előnyös ez?

Tegyük fel, hogy táblázatunk tartalmazza 1000000 rekordokat. Minden bejegyzés egyedi azonosítóval rendelkezik ID. És mondjuk ki kell húznunk egy lemezt ID = 530124. Ha nincs index, akkor MySQL végigfut a tábla összes rekordján, amíg meg nem találja a szükségeset. A legrosszabb esetben kénytelen lesz rendezni 1000000 rekordokat. Természetesen ez nagyon hosszú ideig fog tartani. És ha lenne index (vagyis a mező rendezve lenne), akkor a rekord mintavételezése átlagosan 100.000 alkalommal gyorsabban. Amint látja, az előnyök nyilvánvalóak.

Az indexeknek azonban van egy jelentős hibája, amely nem teszi lehetővé az egyes táblamezők indexelését. Valójában az index egy másik tábla, de egyszerűen a megfelelő mezővel rendezve. Azaz, ha az egyik mezőben indexet készít, egy másik, pontosan ugyanolyan táblát hoz létre, amely további lemezterületet foglal el.

Még egy kis mínusz indexek a MySQL-ben A probléma az, hogy az új rekordok beszúrására vonatkozó kérések a tábla újbóli rendezésére kényszerítik. Ennek eredményeként az új rekordok beszúrása a szokásosnál kicsit tovább tart. De ne felejtsük el, hogy a legtöbb esetben ezt sokkal ritkábban kell megtennie, mint a mintavételezést, így ez a mínusz nem jelentős.

Hogyan készítsünk indexet a MySQL-ben?

Az elsődleges kulcsokhoz ( ELSŐDLEGES KULCS) az index automatikusan létrejön, de a többi mező esetében a műveletek sorrendje igen PHPMyAdmin következő:

És végül szeretnék egy rövid összefoglalót tenni, hogy megértsd: " Mikor kell MySQL indexeket létrehozni?":

  • Ha egy mezőről nagyon gyakran vesznek mintát, akkor indexké kell tenni.
  • Ha nagyon gyakran adnak rekordokat a táblához, és ritkán történik mintavétel (ez néha előfordul), akkor nincs szükség indexek létrehozására.

És még egy dolog. Ha hirtelen azt látja, hogy a kiválasztási kérések nagyon lassúak, akkor elemezze ennek okát. Valószínűleg csak indexet kell hozzáadnia. Általában tesztelje, és minden világossá válik.