데이터베이스 와 SQL에 대한 나의 지식은 대부분 대학 수업을 기반으로합니다. 어쨌든, 나는 데이터베이스 작업을하고있는 회사에서 거의 1 년에 한 번의 몽타주를 보냈습니다.
나는 몇 권의 책을 읽고 난 같은 데이터베이스에 대한 몇 가지 교육에 참여를 촬영 한 MySQL
, PostgreSQL
, SQLite
, Oracle
또한 몇 가지 nonSQL
db
우리의 등 MongoDB
, Redis
, ElasticSearch
등
내가 말했듯이, 나는 많은 지식이 부족한 채로 구걸을했지만 오늘날 누군가는 내 구걸 자의 지식에 완전히 반대하는 것을 말했습니다.
설명하겠습니다. SQL 데이터베이스를 가져 와서 Person
내부에 레코드가 거의없는 간단한 테이블 을 만듭니다 .
id | name | age
-----------------
1 | Alex | 24
2 | Brad | 34
3 | Chris | 29
4 | David | 28
5 | Eric | 18
6 | Fred | 42
7 | Greg | 65
8 | Hubert | 53
9 | Irvin | 17
10 | John | 19
11 | Karl | 23
지금, 그것은 부분입니다, 나는 집중하고 싶습니다- id
입니다 INDEX
.
지금까지는 이런 식으로 작동한다고 생각했습니다. 테이블을 만들 때 INDEX
비어 있습니다. 테이블에 새 레코드를 추가 할 때 INDEX
일부 alghortims를 기반으로 다시 계산됩니다. 예를 들면 다음과 같습니다.
하나씩 그룹화 :
1 ... N
N+1 ... 2N
...
XN+1 ... (X+1)N
그래서, 내 예를 들어 size = 11 elements
그리고 N = 3
그것은 다음과 같이 될 것입니다 :
id | name | age
-----------------
1 | Alex | 24 // group0
2 | Brad | 34 // group0
3 | Chris | 29 // group0
4 | David | 28 // group1
5 | Eric | 18 // group1
6 | Fred | 42 // group1
7 | Greg | 65 // group2
8 | Hubert | 53 // group2
9 | Irvin | 17 // group2
10 | John | 19 // group3
11 | Karl | 23 // group3
따라서 쿼리를 사용할 때 SELECT * FROM Person WHERE id = 8
간단한 계산을 수행 하므로이 8 / 3 = 2
객체를 찾아야 group2
하면이 행이 반환됩니다.
8 | Hubert | 53
이 방법은 시간에 작동하는 O(k)
곳 k << size
. 물론 행을 그룹으로 구성하는 alghoriTM은 훨씬 더 복잡하지만이 간단한 예는 내 관점을 보여줍니다.
이제 저는 오늘 보여 드린 또 다른 접근법을 제시하고 싶습니다.
이 테이블을 다시 한 번 살펴 보겠습니다.
id | name | age
-----------------
1 | Alex | 24
2 | Brad | 34
3 | Chris | 29
4 | David | 28
5 | Eric | 18
6 | Fred | 42
7 | Greg | 65
8 | Hubert | 53
9 | Irvin | 17
10 | John | 19
11 | Karl | 23
이제, 우리는 비슷한을 만드는 Hashmap
매핑 (사실, 말 그대로 그것은 해시지도입니다) id
에 address
이 ID를 가진 행의는. 의 말을하자:
id | addr
---------
1 | @0001
2 | @0010
3 | @0011
4 | @0100
5 | @0101
6 | @0110
7 | @0111
8 | @1000
9 | @1001
10 | @1010
11 | @1011
이제 쿼리를 실행할 때 : SELECT * FROM Person WHERE id = 8
id = 8
메모리의 주소에 직접 매핑 되고 행이 반환됩니다. 물론 이것의 복잡성은입니다 O(1)
.
이제 질문이 거의 없습니다.
1. 두 솔루션의 장점과 단점은 무엇입니까?
2. 현재 데이터베이스 구현에서 어느 것이 더 인기가 있습니까? 다른 DB가 다른 접근법을 사용하고 있습니까?
3. 비 SQL DB에 존재합니까?
미리 감사합니다
비교
| B-tree | Hash Table
----------------------------------------------------
---------------- one element -------------------
----------------------------------------------------
SEARCHING | O(log(N)) | O(1) -> O(N)
DELETING | O(log(N)) | O(1) -> O(N)
INSERTING | O(log(N)) | O(1) -> O(N)
SPACE | O(N) | O(N)
----------------------------------------------------
---------------- k elements -------------------
----------------------------------------------------
SEARCHING | k + O(log(N)) | k * O(1) -> k * O(N)
DELETING | k + O(log(N)) | k * O(1) -> k * O(N)
INSERTING | k + O(log(N)) | k * O(1) -> k * O(N)
SPACE | O(N) | O(N)
N-레코드 수
내가 맞아? 각 삽입 / 삭제 후 B-tree 및 해시 테이블 을 다시 작성하는 비용은 어떻습니까? 의 경우 B-트리 우리는 몇 가지 포인터를 변경해야하지만, 경우에 균형 B- 트리 가 더 많은 노력이 필요합니다. 또한 해시 테이블의 경우 특히 작업이 충돌을 일으키는 경우 작업을 거의하지 않아도됩니다 .
Of course, an alghoritm to organise rows in groups is for sure much more complicated but I think this simple example shows my point of view.
물론, 훨씬 더 복잡하다는 것을 알고 있습니다. 마지막으로 코드에서 말할 때 INDEX
내 솔루션 ( 1 또는 2 ) 중 어느 것이이 실제 솔루션 에 더 가깝습니까? 에 따라 레코드에 액세스하는 데 필요한 시간은 어떻습니까 INDEX
. 정말 O(1)
입니까? B-tree 인덱스를 사용하면 소리가 매우 비슷 O(log2(N))
합니다. 내가 맞아?
O(1)
당신 에 관한 부분 이 맞았습니다! 첫 번째 방법으로, 당신은 B- 트리 인덱스를 설명하는 것 같지만 약간의 오해가 있습니다. 그것은 나무가 더 수준 (그것이 큰, 작은, 작은 가지, ..., 다음 잎 :이, 나무의이 같은 더 복잡하다 (3 또는 아무것도으로 나누기)에는 계산이 없다