7.1 Mga dahilan para sa paglitaw ng mga indeks

Ang isa pang mahalagang bagay kung wala ang mga database ay ang mga index.

Isipin ang isang sitwasyon kung saan mayroong 10 milyong user sa talahanayan ng user , at gusto mong ipakita ang lahat na may antas na higit sa 90. Napakasimpleng isulat ng query na ito:

SELECT * FROM user WHERE level > 90

Mahusay, naisulat namin ang kahilingan nang wala pang isang minuto. At gaano katagal bago maisagawa ang query na ito mula sa SQL server? Upang maisagawa ang naturang query, kailangan niyang dumaan sa 10 milyong mga rekord, at kahit na mayroon lamang isang tala, ito ay aabutin ng maraming oras.

Paano namin gagawin ang isang katulad na gawain sa Java? Una naming pag-uuri-uriin ang koleksyon ng mga user ayon sa antas, at pagkatapos ay napakabilis naming mahahanap ang mga kinakailangang talaan gamit ang isang binary na paghahanap. Sana hindi ko na kailangan ipaliwanag kung ano yun?

Mahusay, ngunit paano kung kailangan na nating pumili ng mga user na ang petsa ng pagpaparehistro ay bago ang 2020? Pagbukud-bukurin muli ayon sa petsa ng pagpaparehistro at gumamit ng binary na paghahanap.

Oo, kung magsasagawa kami ng isang filter sa ilang field, at hindi lang isang beses, ngunit madalas, magiging lubhang kapaki-pakinabang ang pag-imbak ng data na pinagsunod-sunod ayon sa field na ito.

At paano mag-imbak ng data na pinagsunod-sunod nang sabay-sabay sa iba't ibang mga patlang?

At ang sagot ay napaka-simple - kailangan mong mag-imbak hindi ang data mismo, ngunit ang kanilang mga index sa ilang pandaigdigang talahanayan.

Sabihin nating mayroong 10 user na may id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

At nagpasya kang pag-uri-uriin ang mga ito ayon sa antas, kung gayon ang hanay ng kanilang id ay magiging, halimbawa, tulad nito: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

At kung pag-uri-uriin natin ang mga ito ayon sa petsa, makukuha natin, halimbawa: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Ang mga array ng mga id na ito ay tinatawag na mga index . Ang mga elemento mismo ay malaki, hindi namin sila hinawakan. Sa Java, hindi namin hinawakan ang mga bagay, ngunit iniimbak ang kanilang mga sanggunian; sa SQL, hindi namin hinawakan ang mga tunay na string, ngunit iniimbak ang kanilang mga numero.

Hayaan akong muling isulat ito sa Java code:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Ang pag-uuri ng mga koleksyon ay hindi nangangahulugan ng paglipat ng mga aktwal na elemento. Ang koleksyon ay hindi nag-iimbak ng mga tunay na bagay, ngunit nag-uugnay sa kanila. Ang parehong ay totoo para sa mga talahanayan ng SQL. Ang mga totoong linya ay nagsisinungaling sa kanilang sarili at nagsisinungaling.

At kapag kailangan naming madalas na gumawa ng mga seleksyon para sa ilang field, pagkatapos ay magdagdag kami ng isa pang index sa talahanayan (katulad ng isang bagong koleksyon sa Java) at pag-uri-uriin ang mga hilera ng talahanayan, iimbak ang kanilang pinagsunod-sunod na pagkakasunud-sunod sa isang espesyal na index file.

Sana nakatulong ng kaunti ang paghahambing ng Java. Isang maliit na pagsasanay - at para sa iyo, ang paggamit ng mga index ay magiging pinaka-halatang solusyon.

7.2 Pagdaragdag ng mga index sa isang talahanayan

Ang index ay maaaring tukuyin kaagad sa panahon ng paglikha ng talahanayan, o idinagdag pagkatapos. Kadalasan, ito ang pangalawang senaryo na nangyayari - idinaragdag ang mga index habang lumalaki ang laki ng talahanayan at bumabagal ang pag-sample ng data.

Ang pagdaragdag ng isang index sa isang talahanayan ay napaka-simple:

ALTER TABLE table
    ADD INDEX index_name (column);

Kung madalas kang maghanap ng mga talaan sa maraming column nang sabay-sabay, maaari kang tumukoy ng composite index: Gumagamit ang SQL ng maraming column upang mabuo ito.

Ang pagdaragdag ng composite index sa isang table ay napaka-simple din:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Ang mga index ay kumukuha ng maraming espasyo sa disk, kaya kung hindi mo na kailangan ng index, maaari mo itong alisin palagi:

ALTER TABLE table
    DROP INDEX index_name;

Ang mga index mismo ay medyo nakatagong bahagi ng database. Hindi nila naaapektuhan ang format ng pagsusulat ng mga query sa anumang paraan. Kaya lang, ang kanilang presensya ay nagpapabilis ng data sampling at nagpapabagal sa kanilang pagdaragdag at pag-backup.

Ngunit kung isasaalang-alang kung gaano kahalaga ang bilis sa mundo ngayon at kung gaano kamura ang espasyo sa disk, huwag mag-atubiling magdagdag ng mga index para sa lahat ng okasyon. Pasensya na po mga admin...