ความรู้เกี่ยวกับฐานข้อมูลและSQLของฉันขึ้นอยู่กับชั้นเรียนของมหาวิทยาลัยเป็นส่วนใหญ่ อย่างไรก็ตามฉันใช้เวลาสองสามเดือน (เกือบปี) ใน บริษัท ที่ฉันทำงานกับฐานข้อมูล
ฉันได้อ่านหนังสือไม่กี่เล่มและผมได้มีส่วนร่วมในไม่กี่ฝึกอบรมเกี่ยวกับฐานข้อมูลเช่น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
จะถูกคำนวณใหม่ตามบางส่วน ตัวอย่างเช่น:
จัดกลุ่มทีละ:
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
แน่นอนการจัดเรียงแถวเป็นกลุ่มนั้นซับซ้อนกว่านี้มาก แต่ฉันคิดว่าตัวอย่างง่ายๆนี้แสดงมุมมองของฉัน
ดังนั้นตอนนี้ฉันอยากจะนำเสนอวิธีการอื่นซึ่งได้รับการแสดงให้ฉันเห็นในวันนี้
ลองตารางนี้อีกครั้ง:
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
(อันที่จริงแล้วเป็น Hash Map) ซึ่งแมป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. อันไหนที่ได้รับความนิยมมากขึ้นในการใช้ฐานข้อมูลปัจจุบัน? ดีบีเอสที่แตกต่างกันอาจใช้วิธีการที่แตกต่างกันอย่างไร
3. มันมีอยู่ใน nonSQL dbs หรือไม่?
ขอบคุณล่วงหน้า
เปรียบเทียบ
| 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 ต้นไม้และตารางแฮหลังจากแต่ละแทรก / ลบ ? ในกรณีของต้นไม้ Bเราต้องเปลี่ยนพอยน์เตอร์บางส่วน แต่ในกรณีของต้นไม้ b-balanceมันต้องใช้ความพยายามมากขึ้น นอกจากนี้ในกรณีของตารางแฮชที่เราต้องทำการดำเนินงานไม่กี่โดยเฉพาะอย่างยิ่งถ้าการดำเนินการของเราสร้างความขัดแย้ง
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 O(log2(N))
ต้นไม้มันเสียงเหมือน ฉันถูกไหม?
O(1)
คุณทำให้ถูกต้อง! ในวิธีแรกดูเหมือนว่าคุณกำลังอธิบายดัชนีต้นไม้ B แต่คุณมีความเข้าใจผิดบางอย่าง ไม่มีการคำนวณ (หารด้วย 3 หรืออะไรก็ได้) มันซับซ้อนกว่าเนื่องจากต้นไม้มีระดับมากขึ้น (เป็นต้นไม้มีกิ่งใหญ่เล็กเล็กกิ่งไม้ ... แล้วออกจาก :)