Bagaimana database relasional bekerja (Bagian 1)

Halo, Habr! Saya hadir untuk Anda terjemahan artikel
"Bagaimana cara kerja basis data relasional" .


Ketika datang ke database relasional, saya tidak bisa tidak berpikir ada sesuatu yang hilang. Mereka digunakan di mana-mana. Ada banyak basis data yang berbeda: dari SQLite yang kecil dan berguna hingga Teradata yang kuat. Tetapi hanya ada beberapa artikel yang menjelaskan cara kerja database. Anda dapat mencari "howdoesarelationaldatabasework" ("bagaimana database relasional bekerja") untuk melihat seberapa sedikit hasil yang ada. Apalagi artikel ini pendek. Jika Anda mencari teknologi trendi terbaru (BigData, NoSQL, atau JavaScript), Anda akan menemukan lebih banyak artikel mendalam yang menjelaskan cara kerjanya.


Apakah basis data relasional terlalu tua dan terlalu membosankan untuk dijelaskan di luar program universitas, makalah penelitian, dan buku?


gambar


, . 40 , . , - , . , . , , .


, , , . , , CRUD; . , , .


, (BigO). , , . , , : SQL . , , .


, , , . ; .


, 3 :




( , ...), , . , .


, . .


O(1) vs O(n2)


โ€ฆ !


( ) , . , ! , . (cost based optimization).



, . , . , , .


, " O (some_function() )", , some_function(a_certain_amount_of_data) .


**, , ** . , .


gambar


. , . , 1 1 . , :


  • O(1) ( ).
  • O(log(n)) .
  • โ€” O(n2), .
  • .


O(1) O(n2) . , , , 2000 .


  • O (1) 1
  • O (log (n)) 7
  • O (n) 2 000
  • O (n * log (n)) 14 000
  • O (n2) 4 000 000

O(1) O(n2) (4 ) 2 , . , . -.


, - . 1 000 000 ( ):


  • O (1) 1
  • O (log (n)) 14
  • O (n) 1 000 000
  • O (n * log (n)) 14 000 000
  • O (n2) 1 000 000 000 000

, , O (n2) ( !). 0 , , .



:


  • - O (1).
  • O (log (n)).
  • O (n).
  • O (n * log (n)).
  • O (n2).

: .


:



.


, :


  • /

, , n2, :


  • n4: ! .
  • 3n: ! , , ( ).
  • n: .
  • nn: , , ...

: ยซ ยป, . () .


MergeSort ( )


, ? ? sort ()โ€ฆ , โ€ฆ , sort ().


, : . , , , , . , join , merge join ( ).


Merge ()


, : 2 N / 2 N- N . .


, :


gambar


, 8 2 4- . 4- :


  • 1) ( = )
  • 2) , 8
  • 3) ,
  • 1,2,3, .
  • , 8 .

, 4- , ยซยป .


, , merge:


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;

, , (: ). , ; , . , :


  • ,
  • , ( ), .

Division phase ( )


gambar


3 . โ€” log(N) ( N=8, log(N) = 3).


?


! โ€” . , 2. โ€” , . ( 2).


Sorting phase ( )


gambar


() . , N = 8 :


  • 4 , 2
  • 2 , 4
  • 1 , 8

log (N) , N * log(N) .


merge sort


?


:


  • , , , , .

: in-place ( ).


  • /. , , . , 100 .

: .


  • / / .

, Hadoop ( ).


  • (!).

( ) , . , , .


, -


, , 3 . , . .



โ€” . . :


gambar


2- :


  • , .
  • (integer, string, date โ€ฆ).

, , .


, , , , , . N , N โ€” , , ? .


: : heap-organizedtables index-organizedtables. .



โ€” , :


  • , ,
  • ,

,



gambar


N = 15 . , 208:


  • , 136. 136<208, 136.
  • 398>208, , 398
  • 250>208, , 250
  • 200<208, , 200. 200 , ( , , 200).

, , 40


  • , 136. 136 > 40, 136.
  • 80 > 40, , 80
  • 40= 40, . ( ) .
  • , , , .

. , , log (N) . , log(N), !



, . integer, , - . , , "country" (column 3) :


  • ,
  • , ,
  • "UKnode" .

log(N) N . , โ€” .


(, , 2 , , โ€ฆ) , (.. ) ( ).


B+TreeIndex


, , . O(N) , (, ). , -, . . B+Tree. B+Tree :


  • () ( )
  • .

gambar


, ( ). , , ยซ ยป, ( ). O(log(N)) ( ). , .


B+Tree, 40 100:


  • 40 ( 40, 40 ), .
  • 40, , 100.

, M , N . log(N) . , , M M . M+log(N) N . , ( M + log (N) ), . (, 200 ) N (1 000 000 ), .


(!). (, , B+Tree):


  • B+Tree, .
  • B+Tree, O (log (N)) O (N).

, B+Tree . , . : B+ O (log (N)). , . , / / , O (log (N)) . , ( ).


, B+Tree. B+Tree , MySQL. , InnoDB ( MySQL) .


: , - B+ .


Hashtable (-)


โ€” -. , . , - , - ( hash join). (, , ).


- โ€” , . - :


  • - . ( ).
  • . , , , .


:


gambar


- 10 . , 5 , , , 5 . - 10 . , , :


  • 0, 0,
  • 1, 1,
  • 2, 2,
  • โ€ฆ

, , .


, 78:


  • - - 78, 8.
  • - 8, , , 78.
  • 78
  • 2 ( -, ).

, , 59:


  • - - 59, 9.
  • - 9 , โ€” 99. 99!=59, 99 .
  • , (9), (79), โ€ฆ, (29).
  • .
  • 7 .

-


, , , !


- 1 000 000 ( , 6 ), 1 , 000059 . โ€” -, , .


- . , - , :


  • ( โ€” )
  • 2 ( โ€” )
  • 2 ( โ€” , )
  • โ€ฆ

- - O(1).


vs -


?


, .


  • Tabel hash sebagian dapat dimuat ke dalam memori , dan segmen yang tersisa dapat tetap pada disk.
  • Dengan sebuah array, Anda harus menggunakan ruang yang berdekatan di memori. Jika Anda memuat tabel besar, sangat sulit untuk menemukan ruang kontinu yang cukup .
  • Untuk tabel hash, Anda dapat memilih kunci yang diinginkan (misalnya, negara dan nama orang tersebut).

Untuk informasi lebih lanjut, Anda dapat membaca artikel di Java HashMap , yang merupakan implementasi efisien dari tabel hash; Anda tidak perlu memahami Java untuk memahami konsep-konsep yang disajikan dalam artikel ini.

Source: https://habr.com/ru/post/undefined/


All Articles