Kumaha Basis Data Relasional Gawé (Bagian 1)

Héy Habr! Kuring nampilkeun ka perhatian anjeun tarjamahan artikel
"Kumaha database relational dianggo".

Lamun datang ka database relational Abdi teu tiasa mantuan tapi pikir aya hal anu leungit. Éta téh dipaké madhab. Aya loba database béda sadia, ti SQLite leutik tur mangpaat ka Teradata kuat. Tapi aya ngan sababaraha artikel nu ngajelaskeun kumaha database jalan. Anjeun tiasa milarian diri nganggo "howdoesarelationaldatabasework" pikeun ningali kumaha sababaraha hasil. Leuwih ti éta, artikel ieu pondok. Upami anjeun milarian téknologi buzzy panganyarna (BigData, NoSQL atanapi JavaScript), anjeun bakal mendakan tulisan anu langkung jero anu ngajelaskeun kumaha jalanna.

Naha database relasional lami teuing sareng pikaboseneun pikeun dijelaskeun di luar kursus universitas, makalah panalungtikan sareng buku?

Kumaha Basis Data Relasional Gawé (Bagian 1)

Salaku pamekar, Abdi hate ngagunakeun hal kuring teu ngarti. Sareng upami pangkalan data parantos dianggo langkung ti 40 taun, kedah aya alesan. Salila mangtaun-taun, kuring nyéépkeun ratusan jam pikeun leres-leres ngartos kotak hideung aneh ieu anu kuring anggo unggal dinten. database Relational pisan metot sabab maranéhna dumasar kana konsép mangpaat tur bisa dipaké deui. Upami anjeun resep ngartos pangkalan data, tapi teu acan kantos gaduh waktos atanapi karep pikeun neuleuman topik anu lega ieu, anjeun kedah resep kana tulisan ieu.

Sanajan judul artikel ieu eksplisit, Tujuan artikel ieu teu ngartos kumaha carana make database. Ku kituna, Anjeun kudu geus nyaho kumaha carana nulis pamundut sambungan basajan tur queries dasar atah; disebutkeun Anjeun bisa jadi teu ngarti artikel ieu. Éta hiji-hijina hal nu peryogi kauninga, abdi bakal ngajelaskeun sésana.

Kuring gé mimitian ku sababaraha dasar elmu komputer, kayaning pajeulitna waktu algoritma (BigO). Kuring nyaho sababaraha anjeun hate konsep ieu, tapi tanpa eta anjeun moal bisa ngarti intricacies jero database. Kusabab ieu topik badag, Abdi badé difokuskeun naon anu kuring pikir penting: kumaha prosés database SQL panalungtikan. Abdi badé nepangkeun konsép database dasarsupados dina ahir tulisan anjeun gaduh ide ngeunaan naon anu aya di handapeun tiung.

Kusabab ieu mangrupikeun tulisan anu panjang sareng téknis anu ngalibatkeun seueur algoritma sareng struktur data, nyandak waktos anjeun pikeun maca éta. Sababaraha konsép meureun hésé ngarti; anjeun tiasa ngalangkungan aranjeunna sareng tetep nampi ide umum.

Pikeun anu langkung terang diantara anjeun, tulisan ieu dibagi kana 3 bagian:

  • Tinjauan komponén database tingkat rendah sareng tingkat luhur
  • Tinjauan Prosés Optimasi Query
  • Tinjauan Transaksi jeung Manajemén kolam renang panyangga

Balik deui ka Dasar

Sababaraha taun ka pengker (dina galaksi anu jauh, jauh ...), pamekar kedah terang persis jumlah operasi anu aranjeunna coding. Aranjeunna terang algoritma sareng struktur datana ku manah sabab henteu mampuh miceunan CPU sareng mémori komputer anu lambat.

Dina bagian ieu, kuring bakal ngingetkeun anjeun ngeunaan sababaraha konsép ieu sabab penting pikeun ngarti kana pangkalan data. Kuring ogé bakal ngawanohkeun konsép indéks database.

O(1) vs O(n2)

Kiwari, seueur pamekar anu henteu paduli kana pajeulitna waktos algoritma ... sareng aranjeunna leres!

Tapi sawaktos Anjeun keur kaayaan loba data (Kuring teu ngawangkong rébuan) atawa lamun nuju berjuang dina milliseconds, janten kritis ngartos konsep ieu. Sareng sakumaha anu anjeun bayangkeun, pangkalan data kedah nungkulan duanana kaayaan! Abdi moal ngajantenkeun anjeun nyéépkeun waktos langkung seueur tibatan anu diperyogikeun pikeun ngémutan titik. Ieu bakal ngabantosan urang ngartos konsép optimasi dumasar-biaya engké (harga dumasar optimasi).

Konsep

Pajeulitna waktos algoritma dipaké pikeun nempo sabaraha lila hiji algoritma bakal nyandak pikeun ngalengkepan pikeun jumlah tinangtu data. Pikeun ngajelaskeun pajeulitna ieu, kami nganggo notasi matematik badag O. Notasi ieu dipaké ku fungsi nu ngajelaskeun sabaraha operasi hiji algoritma perlu pikeun jumlah inputs tinangtu.

Contona, nalika kuring nyebutkeun "algoritma ieu boga pajeulitna O (some_function ())", hartina algoritma merlukeun some_function (a_certain_amount_of_data) operasi pikeun ngolah jumlah nu tangtu data.

Ku kituna Henteu jumlah data anu penting**, sabalikna ** kumaha jumlah operasi nambahan kalayan ngaronjatna volume data. Pajeulitna waktos henteu nyayogikeun jumlah operasi anu pasti, tapi mangrupikeun cara anu saé pikeun ngira-ngira waktos palaksanaan.

Kumaha Basis Data Relasional Gawé (Bagian 1)

Dina grafik ieu anjeun tiasa ningali jumlah operasi versus jumlah data input pikeun tipena béda pajeulitna waktu algoritma. Kuring ngagunakeun skala logaritmik pikeun mintonkeunana. Dina basa sejen, jumlah data gancang naek ti 1 nepi ka 1 milyar. Urang bisa nempo yén:

  • O(1) atawa pajeulitna konstan tetep konstan (lain eta moal disebut pajeulitna konstan).
  • O(log(n)) tetep low sanajan kalawan milyaran data.
  • Kasusah awon - O(n2), dimana jumlah operasi tumuwuh gancang.
  • Dua komplikasi anu sanésna ningkat sagancangna.

conto

Kalawan jumlah leutik data, bédana antara O (1) jeung O (n2) negligible. Salaku conto, anggap anjeun gaduh algoritma anu kedah ngolah 2000 elemen.

  • Algoritma O(1) bakal ngarugikeun anjeun 1 operasi
  • Algoritma O(log(n)) bakal ngarugikeun anjeun 7 operasi
  • Algoritma O(n) bakal ngarugikeun anjeun 2 operasi
  • Algoritma O(n*log(n)) bakal ngarugikeun anjeun 14 operasi
  • Algoritma O(n2) bakal ngarugikeun anjeun 4 operasi

Beda antara O (1) jeung O (n2) sigana badag (4 juta operasi) tapi anjeun bakal leungit maksimum 2 mdet, ngan waktu keur ngacieupan panon anjeun. Mémang, prosesor modern tiasa ngolah ratusan juta operasi per detik. Ieu sababna kinerja sareng optimasi henteu janten masalah dina seueur proyék IT.

Sakumaha anu ceuk kuring, masih penting pikeun terang konsép ieu nalika damel sareng data anu ageung. Upami waktos ieu algoritma kedah ngolah 1 elemen (anu henteu seueur pikeun pangkalan data):

  • Algoritma O(1) bakal ngarugikeun anjeun 1 operasi
  • Algoritma O(log(n)) bakal ngarugikeun anjeun 14 operasi
  • Algoritma O(n) bakal ngarugikeun anjeun 1 operasi
  • Algoritma O(n*log(n)) bakal ngarugikeun anjeun 14 operasi
  • Algoritma O(n2) bakal ngarugikeun anjeun 1 operasi

Kuring geus henteu dipigawé math, tapi Abdi disebutkeun yen kalawan algoritma O (n2) anjeun boga waktu pikeun inuman kopi a (malah dua!). Upami anjeun nambihan 0 kana volume data, anjeun bakal gaduh waktos sare.

Hayu urang leuwih jero

Pikeun émbaran:

  • Pilarian tabel hash anu saé mendakan unsur dina O (1).
  • Pilarian tangkal saimbang ogé ngahasilkeun hasil dina O(log(n)).
  • Milarian hiji Asép Sunandar Sunarya ngahasilkeun hasil dina O(n).
  • Algoritma asihan anu pangsaéna gaduh pajeulitna O(n*log(n)).
  • Algoritma asihan anu goréng ngagaduhan pajeulitna O (n2).

Catetan: Dina bagian handap urang bakal ningali algoritma ieu sareng struktur data.

Aya sababaraha jinis pajeulitna waktos algoritma:

  • skenario kasus rata
  • skenario hal pangalusna
  • jeung skenario hal awon

Pajeulitna waktos sering mangrupikeun skenario anu paling parah.

Kuring ngan ukur ngobrol ngeunaan pajeulitna waktos algoritma, tapi pajeulitna ogé lumaku pikeun:

  • konsumsi mémori tina algoritma
  • disk I / algoritma konsumsi O

Tangtosna, aya komplikasi anu langkung parah tibatan n2, contona:

  • n4: ieu dahsyat! Sababaraha algoritma anu disebatkeun gaduh pajeulitna ieu.
  • 3n: ieu malah parah! Salah sahiji algoritma anu bakal urang tingali di tengah tulisan ieu ngagaduhan pajeulitna ieu (sareng leres-leres dianggo dina seueur pangkalan data).
  • n faktorial: Anjeun moal pernah meunang hasil anjeun sanajan kalawan jumlah leutik data.
  • nn: Upami anjeun mendakan pajeulitna ieu, anjeun kedah naroskeun ka diri anjeun naha ieu leres-leres widang kagiatan anjeun ...

Catetan: Kuring henteu masihan anjeun definisi saleresna tina sebutan O ageung, ngan ukur ide. Anjeun tiasa maca artikel ieu di Wikipédia pikeun harti nyata (asimtotik).

MergeSort

Naon anu anjeun laksanakeun nalika anjeun kedah nyortir koleksi? Naon? Anjeun nelepon diurutkeun () fungsi ... Ok, jawaban alus ... Tapi pikeun database a, anjeun kudu ngarti kumaha diurutkeun ieu () fungsi jalan.

Aya sababaraha algoritma asihan anu saé, janten kuring bakal difokuskeun anu paling penting: ngagabung diurutkeun. Anjeun bisa jadi teu ngarti naha asihan data mangpaat ayeuna, tapi anjeun kudu sanggeus bagian optimasi query. Leuwih ti éta, pamahaman merge sort bakal nulungan urang engké ngartos database umum gabung operasi disebut ngumpulkeun gabung (perkumpulan ngahiji).

Ngahiji

Kawas loba algoritma mangpaat, merge sort ngandelkeun trik a: ngagabungkeun 2 arrays diurutkeun ukuran N / 2 kana hiji Asép Sunandar Sunarya N-elemen diurutkeun ngan waragad N operasi. Operasi ieu disebut merging.

Hayu urang tingali naon hartina ku conto basajan:

Kumaha Basis Data Relasional Gawé (Bagian 1)

Angka ieu nunjukkeun yén pikeun ngawangun susunan 8 unsur anu diurutkeun terakhir, anjeun ngan ukur kedah ngulang sakali dina susunan 2 4 unsur. Kusabab duanana arrays 4-elemen geus diurutkeun:

  • 1) anjeun ngabandingkeun duanana elemen ayeuna dina dua arrays (di awal ayeuna = kahiji)
  • 2) teras nyandak pangleutikna pikeun nempatkeun kana 8 unsur Asép Sunandar Sunarya
  • 3) sarta pindah ka elemen hareup dina Asép Sunandar Sunarya dimana anjeun nyandak unsur pangleutikna
  • jeung ngulang 1,2,3 dugi ka ngahontal unsur panungtungan salah sahiji arrays.
  • Satuluyna anjeun nyokot elemen sésana tina Asép Sunandar Sunarya séjén pikeun nempatkeun kana hiji Asép Sunandar Sunarya 8 elemen.

Ieu jalan sabab duanana arrays 4-unsur anu diurutkeun sahingga anjeun teu kudu "balik" dina arrays maranéhanana.

Ayeuna urang ngartos trik, ieu pseudocode kuring pikeun ngahiji:

array mergeSort(array a)
   if(length(a)==1)
      return a[0];
   end if

   //recursive calls
   [left_array right_array] := split_into_2_equally_sized_arrays(a);
   array new_left_array := mergeSort(left_array);
   array new_right_array := mergeSort(right_array);

   //merging the 2 small ordered arrays into a big one
   array result := merge(new_left_array,new_right_array);
   return result;

Merge sort megatkeun hiji masalah jadi masalah leutik lajeng manggihan hasil tina masalah leutik pikeun meunangkeun hasil tina masalah aslina (catetan: jenis ieu algoritma disebut ngabagi jeung nalukkeun). Upami anjeun henteu ngartos algoritma ieu, tong hariwang; Abdi henteu ngartos éta pertama kali kuring ningali éta. Upami éta tiasa ngabantosan anjeun, kuring ningali algoritma ieu salaku algoritma dua fase:

  • Fase division, dimana susunan dibagi kana arrays leutik
  • Fase asihan nyaeta dimana arrays leutik digabungkeun (ngagunakeun union) pikeun ngabentuk arrays nu leuwih gede.

Fase divisi

Kumaha Basis Data Relasional Gawé (Bagian 1)

Dina tahap division, arrays dibagi kana unitary arrays dina 3 hambalan. Jumlah formal léngkah nyaéta log(N) (saprak N=8, log(N) = 3).

Kumaha kuring terang ieu?

Abdi genius! Dina kecap - matématika. Ide nya éta unggal hambalan ngabagi ukuran tina Asép Sunandar Sunarya aslina ku 2. Jumlah hambalan téh sabaraha kali anjeun bisa ngabagi Asép Sunandar Sunarya aslina kana dua. Ieu mangrupikeun definisi pasti tina logaritma (dasar 2).

Fase asihan

Kumaha Basis Data Relasional Gawé (Bagian 1)

Dina fase asihan, anjeun mimitian ku susunan unitary (elemen tunggal). Dina unggal léngkah anjeun nerapkeun sababaraha operasi gabungan sareng biaya total nyaéta N = 8 operasi:

  • Dina tahap kahiji anjeun boga 4 merges nu ngarugikeun 2 operasi unggal
  • Dina hambalan kadua anjeun gaduh 2 merges nu ngarugikeun 4 operasi unggal
  • Dina hambalan katilu anjeun gaduh 1 ngahiji nu waragad 8 operasi

Kusabab aya léngkah log(N), total biaya N * log (N) operasi.

Kaunggulan tina merge sort

Naha algoritma ieu kuat pisan?

Kusabab:

  • Anjeun tiasa ngarobih éta pikeun ngirangan tapak mémori supados anjeun henteu nyiptakeun arrays énggal tapi langsung ngarobih array input.

Catetan: jenis ieu algoritma disebut in-tempat (asihan tanpa mémori tambahan).

  • Anjeun tiasa ngarobah éta ngagunakeun spasi disk jeung jumlah leutik memori dina waktos anu sareng tanpa incurring signifikan disk I / O overhead. Ide pikeun ngamuat kana mémori ngan ukur bagian-bagian anu ayeuna diolah. Ieu penting mun anjeun kudu nyortir tabel multi-gigabyte kalawan ngan panyangga memori 100-megabyte.

Catetan: jenis ieu algoritma disebut diurutkeun éksternal.

  • Anjeun tiasa ngarobah éta pikeun ngajalankeun on sababaraha prosés / thread / server.

Contona, diurutkeun ngagabung disebarkeun mangrupakeun salah sahiji komponén konci Hadoop (anu mangrupa struktur dina data badag).

  • Algoritma ieu tiasa ngaktipkeun kalungguhan kana emas (saleresna!).

Algoritma asihan ieu dianggo dina kalolobaan (upami henteu sadayana) pangkalan data, tapi sanés ngan ukur hiji. Upami anjeun hoyong terang langkung seueur, anjeun tiasa maca ieu karya panalungtikan, nu ngabahas pro jeung kontra ngeunaan algoritma asihan database umum.

Array, Tangkal jeung Hash Table

Ayeuna urang ngartos pamanggih pajeulitna waktos sareng asihan, kuring kedah nyarioskeun ka anjeun ngeunaan 3 struktur data. Ieu penting sabab maranéhna mangrupa dasar basis data modern. Kuring ogé bakal ngawanohkeun konsép indéks database.

Asép

A array dua diménsi mangrupa struktur data pangbasajanna. A tabel bisa dianggap salaku Asép Sunandar Sunarya. Salaku conto:

Kumaha Basis Data Relasional Gawé (Bagian 1)

Asép Sunandar Sunarya 2 diménsi ieu mangrupa tabel kalawan baris jeung kolom:

  • Unggal garis ngagambarkeun hiji éntitas
  • Kolom nyimpen sipat anu ngajelaskeun éntitas.
  • Unggal kolom nyimpen data tina tipe husus (integer, string, tanggal ...).

Ieu merenah pikeun nyimpen jeung visualizing data, kumaha oge, mun anjeun kudu manggihan nilai husus, ieu teu cocog.

Salaku conto, upami anjeun hoyong milarian sadaya lalaki anu damel di Inggris, anjeun kedah ningali unggal baris pikeun ngabedakeun barisan éta milik Inggris. Éta bakal ngarugikeun anjeun N transaksidimana N - Jumlah garis, nu teu goréng, tapi bisa aya jalan gancang? Ayeuna waktuna urang wawuh jeung tatangkalan.

Catetan: Kalolobaan database modern nyadiakeun arrays nambahan pikeun nyimpen tabel éfisién: tumpukan-organizedtables jeung indéks-organizedtables. Tapi ieu teu ngarobah masalah gancang manggihan hiji kaayaan husus dina grup kolom.

Tangkal database sareng indéks

Tangkal pamilarian binér mangrupikeun tangkal binér anu ngagaduhan sipat khusus, konci dina unggal titik kedah:

  • leuwih gede ti sakabeh kenop nu disimpen dina subtree kénca
  • kirang ti sakabeh kenop disimpen dina subtree katuhu

Hayu urang tingali naon ieu hartina visually

gagasan

Kumaha Basis Data Relasional Gawé (Bagian 1)

Tangkal ieu N = 15 unsur. Hayu urang milarian 208:

  • Kuring ngamimitian dina akar anu koncina 136. Kusabab 136<208, kuring ningali subtree katuhu tina titik 136.
  • 398> 208 janten kuring ningali subtree kénca node 398
  • 250> 208 janten kuring ningali subtree kénca node 250
  • 200<208, ku kituna kuring nempo subtree katuhu titik 200. Tapi 200 teu boga subtree katuhu, nilai teu aya (sabab upami aya, éta bakal aya dina subtree katuhu 200).

Ayeuna anggap kuring milarian 40

  • Kuring ngamimitian dina akar anu koncina 136. Kusabab 136 > 40, kuring ningali subtree kénca node 136.
  • 80 > 40, ku kituna kuring ningali subtree kénca titik 80
  • 40 = 40, titik aya. Kuring meunangkeun ID baris jero titik (teu ditémbongkeun dina gambar) jeung kasampak dina tabel pikeun ID baris dibikeun.
  • Nyaho ID baris ngamungkinkeun kuring terang persis dimana datana aya dina tabél, ku kituna kuring tiasa nyandak éta langsung.

Tungtungna, duanana pilarian bakal ngarugikeun kuring jumlah tingkat jero tangkal. Lamun maca bagian ngeunaan merge diurutkeun taliti, Anjeun kudu ningali yén aya log (N) tingkat. Tétéla, log biaya milarian (N), lumayan!

Hayu urang balik deui ka masalah urang

Tapi ieu pisan abstrak, jadi hayu urang balik deui ka masalah urang. Gantina integer basajan, ngabayangkeun string nu ngagambarkeun nagara batur dina tabel saméméhna. Anggap anjeun gaduh tangkal anu ngandung widang "nagara" (kolom 3) tabél:

  • Upami anjeun hoyong terang saha anu damel di Inggris
  • Anjeun neuteup kana tangkal pikeun meunangkeun titik nu ngagambarkeun Britania Raya
  • di jero "UKnode" anjeun bakal mendakan lokasi rékaman pagawé Inggris.

Pilarian ieu bakal ngarugikeun operasi log (N) tinimbang operasi N upami anjeun nganggo array langsung. Naon nu kakarék dibere éta indéks database.

Anjeun tiasa ngawangun hiji tangkal indéks pikeun sagala grup widang (string, angka, 2 garis, angka na string, tanggal ...) salami anjeun boga fungsi pikeun ngabandingkeun konci (ie grup widang) sangkan anjeun tiasa nyetél urutan diantara konci (nu kasus pikeun sagala jenis dasar dina database).

B+TreeIndex

Bari tangkal ieu jalan ogé pikeun meunangkeun nilai husus, aya masalah BIG mun anjeun peryogi meunang sababaraha elemen antara dua nilai. Ieu bakal ngarugikeun O(N) sabab anjeun bakal kudu kasampak di unggal titik dina tangkal jeung pariksa naha éta antara dua nilai ieu (misalna ku traversal maréntahkeun tangkal). Leuwih ti éta, operasi ieu teu disk I / O ramah saprak anjeun kudu maca sakabéh tangkal. Urang kedah milarian cara pikeun ngalaksanakeun épisién pamundut rentang. Pikeun ngajawab masalah ieu, database modern ngagunakeun versi dirobah tina tangkal saméméhna disebut B + Tangkal. Dina tangkal B + Tangkal:

  • ngan titik panghandapna (daun) informasi toko (lokasi baris dina tabel patali)
  • sesa titik aya di dieu pikeun routing ka titik nu bener salila pilarian.

Kumaha Basis Data Relasional Gawé (Bagian 1)

Sakumaha anjeun tiasa tingali, aya deui titik di dieu (dua kali). Mémang, anjeun gaduh titik tambahan, "titik kaputusan", anu bakal ngabantosan anjeun mendakan titik anu leres (anu nyimpen lokasi barisan dina tabel anu aya hubunganana). Tapi pajeulitna pilarian masih O(log(N)) (ngan aya hiji tingkat deui). Beda badag éta titik di tingkat handap disambungkeun ka panerusna.

Kalayan B + Tangkal ieu, upami anjeun milarian nilai antara 40 sareng 100:

  • Anjeun ngan perlu néangan 40 (atawa nilai pangdeukeutna sanggeus 40 lamun 40 teu aya) kawas anjeun teu jeung tangkal saméméhna.
  • Teras kumpulkeun 40 ahli waris nganggo tautan ahli waris langsung dugi ka ngahontal 100.

Hayu urang manggihan M panerusna jeung tangkal boga N titik. Manggihan titik husus waragad log (N) kawas tangkal saméméhna. Tapi saatos anjeun nampi titik ieu, anjeun bakal nampi panerus M dina operasi M kalayan rujukan ka panerusna. Pilarian ieu ngan ukur biaya M+log(N) operasi dibandingkeun N operasi dina tangkal saméméhna. Leuwih ti éta, anjeun teu kudu maca tangkal pinuh (ngan M + log (N) titik), nu hartina pamakéan disk kirang. Lamun M leutik (misalna 200 jajar) jeung N badag (1 jajar), bakal aya bédana BIG.

Tapi aya masalah anyar di dieu (deui!). Upami anjeun nambihan atanapi ngahapus baris dina pangkalan data (sareng ku kituna dina indéks B + Tangkal anu aya hubunganana):

  • Anjeun kudu ngajaga urutan antara titik di jero hiji B + Tangkal, disebutkeun Anjeun moal bisa manggihan titik di jero tangkal unsorted.
  • anjeun kudu tetep jumlah minimum mungkin tina tingkat dina B + Tangkal, disebutkeun O (log (N)) pajeulitna waktos janten O (N).

Dina basa sejen, B + Tangkal kudu timer susunan jeung saimbang. Kabeneran, ieu tiasa dilakukeun ku ngahapus pinter sareng operasi selapkeun. Tapi ieu asalna di ongkos: insertions na ngahapus dina B + tangkal biaya O(log(N)). Éta sababna sababaraha anjeun parantos ngadéngé éta ngagunakeun loba teuing indexes sanes mangrupakeun ide nu sae. Nyaan, anjeun slowing handap gancang nyelapkeun / ngamutahirkeun / mupus hiji baris dina tabelsabab database perlu ngamutahirkeun indexes tabel urang ngagunakeun O mahal (log (N)) operasi pikeun tiap indéks. Leuwih ti éta, nambahkeun indexes hartina leuwih workload pikeun manajer transaksi (bakal dijelaskeun dina tungtung tulisan).

Pikeun langkung rinci, anjeun tiasa ningali artikel Wikipedia ngeunaan B+tangkal. Upami anjeun hoyong conto palaksanaan B + Tangkal dina pangkalan data, tingali artikel ieu и artikel ieu ti pamekar MySQL ngarah. Duanana museurkeun kana kumaha InnoDB (mesin MySQL) nanganan indéks.

Catetan: A maca ngawartoskeun kuring yén, alatan optimizations-tingkat low, tangkal B + kudu sagemblengna saimbang.

Hashtable

Struktur data penting terakhir urang nyaéta tabel hash. Ieu mangpaat pisan nalika anjeun hoyong gancang milarian nilai. Leuwih ti éta, pamahaman tabel hash bakal nulungan urang engké ngartos operasi gabungan database umum disebut hash gabung ( hash gabung). Struktur data ieu ogé dipaké ku database pikeun nyimpen sababaraha hal internal (misalna. méja konci atawa kolam renang panyangga, urang bakal ningali duanana konsep ieu engké).

Tabel hash mangrupikeun struktur data anu gancang mendakan unsur ku konci na. Pikeun ngawangun tabel hash anjeun kedah ngartikeun:

  • konci pikeun elemen Anjeun
  • fungsi hash pikeun konci. Hashes konci anu diitung masihan lokasi elemen (disebut bagéan ).
  • fungsi pikeun ngabandingkeun konci. Sakali anjeun mendakan ruas anu leres, anjeun kedah mendakan unsur anu anjeun milarian dina ruas nganggo perbandingan ieu.

conto basajan

Hayu urang nyandak conto anu jelas:

Kumaha Basis Data Relasional Gawé (Bagian 1)

Méja hash ieu ngagaduhan 10 bagéan. Ku sabab puguh kuring ngan ukur ngagambar 5 ruas, tapi kuring terang anjeun pinter, janten kuring ngantepkeun anjeun ngagambar 5 anu sanésna nyalira. I dipaké hiji modulo fungsi hash 10 konci. Kalayan kecap sanésna, kuring ngan ukur nyimpen angka anu terakhir tina konci unsur pikeun milarian ruasna:

  • lamun digit panungtungan nyaéta 0, unsur digolongkeun kana ruas 0,
  • lamun digit panungtungan nyaéta 1, unsur digolongkeun kana ruas 1,
  • lamun digit panungtungan nyaéta 2, unsur ragrag kana aréa 2,
  • ...

Fungsi ngabandingkeun I dipaké nyaéta saukur sarua antara dua integer.

Anggap anjeun hoyong kéngingkeun unsur 78:

  • Tabel hash ngitung kode hash pikeun 78, nyaéta 8.
  • Méja hash ningali bagéan 8, sareng unsur anu munggaran dipanggihan nyaéta 78.
  • Manehna mulih item 78 ka anjeun
  • Pilarian waragad ukur 2 operasi (hiji keur ngitung nilai hash sarta séjén pikeun néangan up unsur dina ruas).

Ayeuna hayu urang nyebutkeun rék meunang unsur 59:

  • Tabel hash ngitung kode hash pikeun 59, nyaéta 9.
  • Tabél hash maluruh dina ruas 9, unsur munggaran kapanggih nyaéta 99. Kusabab 99!=59, unsur 99 lain unsur valid.
  • Ngagunakeun logika sarua, unsur kadua (9), katilu (79), ..., panungtungan (29) dicokot.
  • Unsur teu kapanggih.
  • Pilarian biaya 7 operasi.

Fungsi hash anu saé

Sakumaha anjeun tiasa tingali, gumantung kana nilai nu Anjeun keur pilari, biaya teu sarua!

Upami kuring ayeuna ngarobih fungsi hash modulo 1 tina konci (nyaéta, nyandak 000 digit terakhir), pamariksaan kadua ngan ukur 000 operasi sabab henteu aya unsur dina ruas 6. Tangtangan nyata nyaéta milarian fungsi Hash anu saé anu bakal nyiptakeun ember anu ngandung sajumlah elemen anu leutik.

Dina conto abdi, manggihan hiji fungsi Hash alus téh gampang. Tapi ieu mangrupikeun conto saderhana, milarian fungsi hash anu saé langkung sesah nalika koncina nyaéta:

  • string (contona - ngaran tukang)
  • 2 baris (contona - ngaran tukang jeung ngaran hareup)
  • 2 garis sareng titimangsa (contona - ngaran tukang, ngaran hareup jeung tanggal lahir)
  • ...

Kalayan fungsi hash anu saé, panéangan tabel hash hargana O(1).

Array vs tabel hash

Naha henteu nganggo Asép Sunandar Sunarya?

Hmm, patarosan anu saé.

  • Méja hash tiasa sawaréh dimuat kana mémori, sarta bagéan sésana bisa tetep dina disk.
  • Kalawan Asép Sunandar Sunarya anjeun kudu make spasi contiguous dina mémori. Upami anjeun ngamuat méja ageung éta hésé pisan manggihan spasi kontinyu cukup.
  • Pikeun tabel hash, anjeun tiasa milih konci anu dipikahoyong (contona, nagara sareng nami tukang).

Kanggo inpo nu leuwih lengkep, Anjeun bisa maca artikel ngeunaan JawaHashMap, nu mangrupa palaksanaan efisien tabel Hash; anjeun henteu kedah ngartos Java pikeun ngartos konsép anu katutupan dina tulisan ieu.

sumber: www.habr.com

Tambahkeun komentar