1. Trang chủ
  2. » Công Nghệ Thông Tin

Dbms report group 1

33 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề MySQL & Cassandra
Tác giả Vương Anh Khoa, Nguyễn Phạm Duy An, Nguyễn Xuân Trực, Cao Nguyệt Minh
Người hướng dẫn TS. Võ Thị Ngọc Châu
Trường học Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Chuyên ngành Hệ quản trị cơ sở dữ liệu
Thể loại Báo cáo
Năm xuất bản 2020-2021
Thành phố Tp. Hồ Chí Minh
Định dạng
Số trang 33
Dung lượng 2,22 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

1 Các tính năng lựa chọnNhóm 1 sẽ chọn các tính năng sau để trình bày trong báo cáo: • Lựa chọn cấu trúc lưu trữ cho tập tin dữ liệu • Thực hành với chỉ mục • Thực hành khôi phục dữ liệu

Trang 1

Hệ quản trị cơ sở dữ liệu (CO3021)

MySQL & Cassandra

GVHD: TS Võ Thị Ngọc Châu

SV thực hiện: Vương Anh Khoa – 1711803

Nguyễn Phạm Duy An – 1710430Nguyễn Xuân Trực – 1513804Cao Nguyệt Minh – 1710188

Tp Hồ Chí Minh, Tháng 01/2020

Trang 2

Mục lục

2 Tính năng lựa chọn cấu trúc lưu trữ cho tập tin dữ liệu 3

2.1 MySQL 3

2.1.1 InnoDB 3

2.1.2 Các kiểu dữ liệu trong MySQL 5

2.2 Cassandra 8

2.2.1 Cấu trúc chung của Cassandra 8

2.2.2 Các Kiểu dữ liệu trong Cassandra 10

3 Tính năng thực hành với chỉ mục 13 3.1 MySQL 13

3.1.1 Tổng quan 13

3.1.2 Cấu trúc chỉ mục trong MySQL 13

3.1.3 Các câu lệnh DDL liên quan đến index trong MySQL 14

3.1.4 Ví dụ minh họa: 15

3.2 Cassandra 15

4 Tính năng thực hành phục hồi dữ liệu 18 4.1 MySQL 18

4.1.1 Tóm tắt lý thuyết 18

4.1.2 Thực hành phục hồi dữ liệu 18

4.2 Cassandra 19

5 Tính năng thực hành sao lưu dữ liệu 21 5.1 MySQL 21

5.1.1 Tóm tắt lý thuyết 21

5.1.2 Thực hành sao lưu dữ liệu trên Windown 21

5.1.2.a Ví dụ 1: sao lưu database "quanlydean" bằng dòng lệnh 21 5.1.2.b Ví dụ 2: sao lưu database "quanlydean" bằng file batch 22 5.1.2.c Ví dụ 3: sao lưu database "quanlydean" hoàn toàn tự động 24 5.2 Cassandra 26

5.2.1 Snapshot tất cả không gian khóa 27

5.2.2 Snapshot một không gian khóa 27

5.2.3 Snapshot một bảng 28

5.2.4 Incremental Backup 28

5.2.5 Thực hành sao lưu dữ liệu với Cassandra 29

Trang 3

1 Các tính năng lựa chọn

Nhóm 1 sẽ chọn các tính năng sau để trình bày trong báo cáo:

• Lựa chọn cấu trúc lưu trữ cho tập tin dữ liệu

• Thực hành với chỉ mục

• Thực hành khôi phục dữ liệu

• Thực hành sao lưu dữ liệu

Trang 4

2 Tính năng lựa chọn cấu trúc lưu trữ cho tập tin dữ liệu 2.1 MySQL

• MySQL là cơ sở dữ liệu hướng đối tượng Dữ liệu được tổ chức thành nhiều bản ghi (record).Một record bao gồm nhiều trường dữ liệu (field) và các giá trị tương ứng của các trườngcủa record đó Một table sẽ gồm nhiều record có cấu trúc field giống nhau Trong mô hìnhERD thì table tương ứng với một entity và các field của record là các thuộc tính (attribute)của entity đó

• Theo mặc định, các record sẽ được sắp xếp vật lí dưới đĩa dựa trên PRIMARY KEYINDEX

• Dạng lưu trữ hàng, cột, bảng vv trong MySQL hay các hệ quản trị cơ sở dữ liệu khác làcách lưu trữ luận lí nhằm giúp cho người dùng có thể dễ dàng hiểu và sử dụng cơ sở dữliệu Tuy vậy, muốn hiểu việc MySQL lưu trữ dữ liệu trên ổ cứng như thế nào thì ta cầnhiểu đến khái niệm Storage Engine Storage Engine thực chất là cách MySQL lưu trữ

dữ liệu trên đĩa cứng MySQL lưu mỗi database như là một thư mục con nằm dưới thưmục data Khi một table được tạo ra, MySQL sẽ lưu định nghĩa bảng ở file đuôi frm vàtên trùng với tên của bảng được tạo Ta sẽ tiến hành đi tìm hiểu một Storage Engine được

sử dụng phổ biến cùng với MySQL: InnoDB

2.1.1 InnoDB

Một bản ghi vật lí của MySQL sử dụng storage engine InnoDB sẽ gồm có 3 phần: Field StartOffsets, Extra Bytes, Field Contents

Field Start Offsets (F*1) hoặc (F*2) bytes

Field Contents Tùy thuộc vào giá trị của field

Chữ ’F’ đại diện cho số field của record

Các bản ghi sẽ được lưu trữ vật lí vào một đơn vị, được gọi là "page" (hoặc "block").Mỗi page có độ dài cố định là 16KB Một page gồm có 7 phần được sắp xếp theo thứ tự nhưsau: Fil Header, Page Header, Infimum + Supremum Records, User Records, Free Space, PageDirectory, Fil Trailer Có thể thấy ở phần giữa của page là các record chứa dữ liệu và khoảngtrống free space dùng để chèn các record mới vào

Trong nội dung bài báo cáo này, nhóm sẽ trình bày chi tiết hơn về cấu trúc lưu trữ vật lí củabản ghi (record)

2.1.1.1 Field Start Offsets:

• Về cơ bản, phần này gồm những thông tin về địa chỉ bắt đầu của một trường dữ liệu

• Ta có một ví dụ minh họa sau: Giả sử có một record có 3 field Field 1 có độ dài 1, Field

2 có độ dài 2, Field 3 có độ dài 4 Trong trường hợp này, các giá trị offset của các trường

sẽ lần lượt là: 1, 3 (1+2), and 7 (1+2+4) Các giá trị này sẽ được lưu theo chiều ngược lạinên khi lưu dưới dạng nhị phân sẽ trở thành: 07,03,01

Trang 5

2.1.1.2 Extra Bytes:

• Là header gồm có 6 bytes (fixed-size, 48 bits)

min_rec_flag 1 bit 1 nếu record được định nghĩa tối thiểu trước

heap_no 13 bits Thứ tự record trong heap của trang indexn_fields 10 bits Số trường trong record này (1-1023)1byte_offs_flag 1 bit 1 nếu phần Field Start Offsets có độ dài 1 bytenext 16 bits 16 bits Con trỏ đến record tiếp theo trong trang

• Giả sử cho một pointer trỏ đến điểm khởi đầu, InnoDB tìm điểm bắt đầu của một recordbằng cách:

– Cho biến X = n_fields

– Nếu 1byte_offs_flag == 0 thì X = X * 2

– Cho X = X + 6 (Cộng thêm 6 bytes của phần Extra Bytes)

– Điểm bắt đầu của record ở địa chỉ pointer value - X

• Bảng T thực chất được tạo ra với 6 cột InnoDB tự động thêm vào 3 "cột hệ thống" vàođầu để quản lí 3 cột này lần lượt là row ID, transaction ID và rollback pointer

• Tiếp theo, Thêm vào bảng một vài record:

INSERT INTO T VALUES (’PP’, ’PP’, ’PP’);

INSERT INTO T VALUES (’Q’, ’Q’, ’Q’);

INSERT INTO T VALUES (’R’, NULL, NULL);

• Khi đó, giá trị nhị phân được lưu dưới đĩa cứng sẽ như sau:

19 17 15 13 0C 06 Field Start Offsets /* First Row */

00 00 78 0D 02 BF Extra Bytes

00 00 00 00 04 21 System Column #1

00 00 00 00 09 2A System Column #2

Trang 6

Các kiểu số nguyên tiêu chuẩn của SQL như INTEGER (or INT) và SMALLINT đều được

hỗ trợ bởi MySQL Và các mở rộng tiêu chuẩn, MySQL cũng hỗ trợ các kiểu số nguyên khác nhưTINYINT, MEDIUMINT, và BIGINT Bảng dưới đây sẽ liệt kê các kiểu và không gian lưu trữđòi hỏi và phạm vi của chúng (Giá trị nhỏ nhất, lớn nhất cho kiểu số nguyên có dấu, và khôngdấu)

2.1.2.2 Kiểu dấu chấm động (Floating-Point Types)

Kiểu dữ liệu FLOAT và DOUBLE mô tả gần đúng các giá trị số thực MySQL sử dụng 4byte để lưu trữ dữ liệu FLOAT và 8 byte dành cho kiểu dữ liệu DOUBLE

• FLOAT(M,D): Một số chấm động (floating-point number) không thể không có dấu signed) Có thể định nghĩa độ dài phần nguyên (M) và độ dài phần thập phân (D) Điềunày không bắt buộc và mặc định là 10,2, ở đây 10 là độ dài phần nguyên còn 2 là số sốthập phân Phần thập phân có thể sử dụng 24 vị trí cho một số FLOAT

(un-• DOUBLE(M,D): Một số chấm động DOUBLE (Độ chính xác gấp 2) cũng không thể không

có dấu (unsigned) Có thể định nghĩa độ dài phần nguyên (M) và độ dài phần thập phân

Trang 7

(D) Điều này không bắt buộc và mặc định là 16,4, ở đó 16 là độ dài phần nguyên còn 4 là

độ dài phần thập phân Phần thập phân có thể sử dụng tới 53 vị trí cho một số DOUBLE.REAL là một từ đồng nghĩa với DOUBLE

2.1.2.3 Kiểu dấu chấm cố định (Fixed-Point Types)

Kiểu dấu chấm cố định (Fixed-Point data type) được sử dụng để bảo vệ độ chính xác(precision), ví dụ như với dữ liệu tiền tệ Trong MySQL kiểu DECIMAL và NUMERIC lưu trữchính xác các dữ liệu số MySQL 5.6 lưu trữ giá trị DECIMAL theo định dạng nhị phân.Trong SQL chuẩn, cú pháp DECIMAL(5,2) nghĩa là độ chính xác (precision) là 5, và 2 làphần thập phân (scale), nghĩa là nó có thể lưu trữ một giá trị có 5 chữ số trong đó có 2 số thậpphân Vì vậy giá trị lưu trữ sẽ là -999.99 tới 999.99 Cú pháp DECIMAL(M) tương đương vớiDECIMAL(M,0) Tương tự DECIMAL tương đương với DECIMAL(M,0) ở đây M mặc định là

10 Độ dài tối đa các con số cho DECIMAL là 65

2.1.2.4 Kiểu dữ liệu DATETIME, DATE, và TIMESTAMP

• DATETIME: Sử dụng khi cần giá trị lưu trữ cả hai thông tin ngày tháng và thời gian Vídụ: 2020-03-20 07:30:45

• DATE: Sử dụng khi muốn lưu trữ chỉ thông tin ngày tháng Ví dụ: 2020-03-20

• TIMESTAMP: Lưu trữ cả hai thông tin ngày tháng và thời gian Giá trị này sẽ được chuyểnđổi từ múi giờ hiện tại sang UTC trong khi lưu trữ, và sẽ chuyển trở lại múi giờ hiện tạikhi lấy dữ liệu ra

Kiểu dữ liệu DATETIME được sử dụng khi cần lưu trữ cả hai thông tin ngày tháng và thờigian MySQL lấy và hiển thị DATETIME theo định dạng ‘YYYY-MM-DD HH:MM:SS’ Và hỗtrợ phạm vi từ ’1000-01-01 00:00:00’ tới ’9999-12-31 23:59:59’

Kiểu dữ liệu TIMESTAMP cũng được sử dụng khi muốn lưu trữ cả hai thông tin ngày tháng

và thời gian TIMESTAMP có phạm vi ’1970-01-01 00:00:01’ UTC tới ’2038-01-19 03:14:07’ UTC

Sự khác biệt chính của DATETIME và TIMESTAMP là giá trị của TIMESTAMP đượcchuyển đổi từ múi giờ hiện tại sang UTC trong khi lưu trữ, và chuyển ngược trở lại từ UTC sangmúi giờ hiện tại trong lúc lấy ra Còn kiểu dữ liệu DATETIME thì không có gì thay đổi.2.1.2.5 Kiểu dữ liệu CHAR và VARCHAR

Các field có thể được chia ra làm 2 loại: fixed-length và variable-length (độ dài cố định và

độ dài biến đổi) Chẳng hạn đối với MySQL, một field với type INT sẽ có độ dài cố định là4-byte Hoặc CHAR với độ dài cố định do người dùng định nghĩa (0-255 bytes), DBMS sẽ lưu

dữ liệu dạng CHAR bằng cách right-padding khoảng trắng để bù cho đủ độ dài định nghĩa trên.Tuy vậy khi truy xuất dữ liệu khoảng trắng sẽ bị bỏ đi Còn field với type VARCHAR thì

sẽ có độ dài thay đổi (Tuy vậy độ dài tối đa vẫn được định nghĩa trước, dao động cũng trongkhoảng 0-255) VARCHAR sẽ có 1 byte prefix để lưu trữ độ dài của giá trị

Trang 8

Hình 1: Ví dụ về lưu trữ dữ liệu theo kiểu CHAR

Hình 2: Ví dụ về lưu trữ dữ liệu theo kiểu VARCHAR

2.1.2.6 Kiểu dữ liệu BLOB

BLOB là một đối tượng nhị phân lớn (Binary Large OBject) có thể chứa một lượng lớn dữliệu Có bốn loại BLOB, TINYBLOB, BLOB, MEDIUMBLOB, và LONGBLOB Nhưng chỉkhác nhau về độ dài tối đa của các giá trị có thể giữ Kiểu dữ liệu BLOB thường được dùng đểlưu trữ dữ liệu dưới dạng hình ảnh

Trang 9

2.2 Cassandra

2.2.1 Cấu trúc chung của Cassandra

Cassandra là một hệ quản trị cơ sở dữ liệu phân tán (NoSQL)

Cơ sở dữ liệu Cassandra được phân tán trên nhiều máy hoạt động với nhau (cluster) Cassandrasắp xếp các nút trong một cluster theo định dạng vòng và gán dữ liệu cho chúng

Keyspace là vỏ bọc ngoài cùng cho dữ liệu trong Cassandra, là một kho chứa các ColumnFamily Tất cả dữ liệu của Cassandra được đặt trong Keyspace nên có thể tạo một Keyspaceduy nhất cho tất các các Column Family Các thuộc tính cơ bản của keyspace trong Cassandrabao gồm:

• Yếu tố nhân rộng (Replication factor): là số lượng máy trong một cluster sẽ nhậnđược các bản sao của cùng một dữ liệu

• Chiến lược đặt bản sao (Replica placement strategy): chiến lược để đặt bản saotrong vòng (chiến lược đơn giản , chiến lược cấu trúc , chiến lược liên kết mạng)

Hình 3: Hình ảnh minh họa cấu trúc Keyspace

Dữ liệu được lưu trữ trong DB của Cassandra thuộc dạng Key value store (KVS)

Trang 10

Mô hình dữ liệu Cassandra tuân theo quy tắc hệ thống cột (the column family):

• Column Family: là một đối tượng của NoSQL nơi chứa các cột dữ liệu Nó là một tậphợp dữ liệu chứa các cặp “khóa – giá trị” Trong đó “khóa” được ánh xạ đến một giá trịgồm tập hợp các cột Tương tự với RDBMS, column family là một bảng, mỗi cặp “khóa –giá trị” là một hàng

Hình 4: Hình ảnh minh họa cấu trúc Column family

• Cột là một tập hợp dữ liệu (bộ 3) gồm tên cột, giá trị, và mốc thời gian

Hình 5: Hình ảnh minh họa cấu trúc cột

• Siêu cột một cột đặc biệt lưu trữ bản đồ (map) của các cột Nó giúp lưu trữ cũng nhưtruy xuất dữ liệu dễ dàng và nhanh chóng hơn

Hình 6: Hình ảnh minh họa cấu trúc siêu cột

Trang 11

2.2.2 Các Kiểu dữ liệu trong Cassandra

2.2.2.1 Các kiểu dữ liệu cơ bản:

• ascii: Biểu diễn cho một chuỗi ký tự ASCII Việc chèn bất kỳ ký tự không phải ASCII vàomột cột của kiểu dữ liệu này sẽ cho ra một lỗi

• bigint: Đại diện cho số nguyên có dấu dài 64-bit Được sử dụng để lưu trữ những con sốdài Nó nên được sử dụng chỉ khi chúng ta chắc chắn cần các số dài vì nó chiếm nhiềukhông gian bộ nhớ hơn so với int

• blob: dùng để lưu trữ các byte tuỳ ý Nó ở hệ thập lục phân, và bất kỳ dữ liệu nào khôngcần xác nhận có thể được lưu trữ trong trường này

• boolean: Lưu trữ true hoặc false

• counter: Đại diện cho một số nguyên dài 64-bit, nhưng giá trị của cột này không thể thiếtlập Chỉ có hai hoạt động trên cột này, tăng và giảm Trong một bảng với một cột counter,chỉ có các kiểu counter và khóa chính là được phép Không có câu lệnh INSERT được phéptrong một bảng với các column counter; chỉ UPDATE có thể được sử dụng Ví dụ:

> CREATE TABLE website_tracker (

id int PRIMARY KEY,url text,

visitor_count counter);

> UPDATE website_trackerSET visitor_count = visitor_count + 1WHERE id = 1;

> SELECT * FROM website_tracker;

id | url | count + -+ -

1 | a.com | 1(1 rows)

• date: Đại diện cho một giá trị ngày mà không có một giá trị giờ Cassandra mã hóa giốngnhư một giá trị số nguyên kể từ epoch Ngày có thể được biểu diễn như là chuỗi trong địnhdạng yyyy-mm-dd

• decimal: Đại diện cho một biến-giá trị thập phân chính xác Dùng tốt nhất trong việc lưutrữ tiền tệ hoặc các giá trị tài chính

• double: Lưu trữ một giá trị dấu chấm động dài 64-bit

• float: Lưu trữ một giá trị dấu chấm động 32-bit

• inet: Biểu diễn cho một chuỗi địa chỉ IP trong định dạng của IPv4 hoặc IPv6

• int: Biểu diễn cho một số nguyên có dấu dài 32-bit Sử dụng chủ yếu để lưu trữ các giá trị

số nguyên

Trang 12

• smallint: Biểu diễn cho một số nguyên 2 byte (16-bit) Có thể được ưu tiên hơn so vớikiểu int để lưu trữ các giá trị số nguyên nhỏ để tiết kiệm không gian lưu trữ.

• text: Biểu diễn cho một chuỗi mã hoá UTF-8 Nên được sử dụng khi chúng ta muốn lưutrữ các ký tự không phải mã ASCII

• time: Biểu diễn cho một giá trị thời gian Đại diện như một chuỗi ở dạng 01:02:03.123 vàlưu trữ số nguyên có dấu dài 64-bit đại diện cho số nano giây trôi qua kể từ nửa đêm

• timestamp: Lưu trữ cả thành phần ngày và giờ với độ chính xác milli giây Có thể đượcbiểu diễn dưới dạng văn bản ở định dạng 2016-12-01 01:02:03.123

• tinyint: Biểu diễn cho một số nguyên 1 byte (8 bit) Có thể được ưu tiên hơn so với kiểuint hoặc smallint để lưu trữ các giá trị số nguyên nhỏ để tiết kiệm không gian lưu trữ

• timeuuid: Lưu trữ phiên bản 1 UUID

• uuid: UUID ở định dạng chuẩn Đây là một giá trị lớn hơn so với timeuuid

• varchar: Tương tự như văn bản Cả hai có thể được sử dụng để thay thế cho nhau

• variant: Một giá trị số nguyên với độ chính xác tùy ý Nó được khuyên nên sử dụng mộtkiểu dữ liệu với độ chính xác cần thiết

• bigint:

2.2.2.2 Các kiểu Dữ liệu Tập hợp:

• set: Kiểu này lưu trữ một bộ sưu tập các giá trị Các giá trị được lưu trữ không có thứ tự,nhưng CQLSH sẽ trả về dữ liệu đã được sắp xếp Ví dụ: chuỗi sẽ được sắp xếp theo thứ tựABC Hãy sửa đổi bảng mà chúng ta đã tạo ra ở trên:

> ALTER TABLE website_tracker ADD tagsSet set<text>;

> UPDATE website_tracker SET tagsSet = {’tag1’} WHERE id = 1;

> SELECT tagsSet FROM website_tracker WHERE id = 1;

tagsSet -{’tag1’}

> UPDATE website_tracker SET tagsSet = tagsSet + {’gat2’} WHERE id = 1;

> SELECT tagsSet FROM website_tracker WHERE id = 1;

tagsSet -{’gat2’, ’tag1’}

Bạn có thể sử dụng các toán tử tập hợp thông thường như difference để loại bỏ các phần

tử Để xóa hoặc thay thế toàn bộ tập hợp, thực hiện SET tags = <thứ gì đó>

Trang 13

• list: Một danh sách cũng lưu trữ một bộ sưu tập các giá trị nhưng lưu trữ chúng theo kiểu

đã được sắp xếp, mặc định sắp theo thứ tự chèn vào Hãy thử làm điều tương tự như chúng

ta đã làm ở trên với bộ sưu tập với một danh sách ngay bây giờ:

> ALTER TABLE website_tracker ADD tagsList list<text>;

> UPDATE website_tracker SET tagsList = [’tag1’] WHERE id = 1;

> SELECT tagsList FROM website_tracker WHERE id = 1;

tagsList -[’tag1’]

> UPDATE website_tracker SET tagsList = tagsList + [’gat2’] WHERE id = 1;

> SELECT tagsList FROM website_tracker WHERE id = 1;

tagsList -[’tag1’, ’gat2’]

Trong một danh sách, các giá trị có thể được thêm vào đằng trước, trừ ra (như trong bộsưu tập), chèn/thay thế /xóa bởi giá trị index (SET tags[1] = ’<một số giá trị>’), vv

• map: Một bản đồ chứa một bộ sưu tập của các cặp khóa-giá trị Đây có thể là bất cứ điều

gì ngoại trừ kiểu counter Hãy xem mô tả nhỏ cho mỗi thẻ

> ALTER TABLE website_tracker ADD tagsMap map<text, text>;

> UPDATE website_tracker SET tagsMap = {’tag1’: ’Tag One’} WHERE id = 1;

> SELECT tagsMap FROM website_tracker WHERE id = 1;

tagsMap -{’tag1’: ’Tag One’}

> UPDATE website_tracker SET tagsMap[’tag2’] = ’Tag Two’ WHERE id = 1;

> SELECT tagsMap FROM website_tracker WHERE id = 1;

tagsMap -{’tag1’: ’Tag One’, ’tag2’: ’Tag Two’}

2.2.2.3 Các kiểu Dữ liệu Tập hợp:

Chúng ta có thể định nghĩa các kiểu dữ liệu của riêng mình trong Cassandra Điều này tạo ra

Trang 14

rất nhiều sự linh hoạt và dễ dàng bảo dưỡng tổng thể Giả sử chúng ta muốn lưu trữ địa chỉđăng ký của trang web.

> CREATE TYPE address (

street text,

city text,

state text);

> ALTER TABLE website_tracker ADD reg_address address;

Để sử dụng một kiểu dữ liệu tuỳ biến trong một bộ sưu tập lồng nhau, chúng ta cần phải xácđịnh nó như là một bộ sưu tập frozen

> ALTER TABLE website_tracker ADD reg_addresses map<text, frozen<address>>;

• Ta có thể tạo một index cho một tập hợp nhiều cột trong table Giá trị của một index key

là phép concat các giá trị từ các record của các cột đó Chẳng hạn nếu ta tạo index chochỉ một cột col_1 thì index key sẽ chỉ có giá trị tương ứng với giá trị record của cột đó.Còn nếu tạo index với 3 cột gộp col_1, col_2, col_3 thì giá trị của index key sẽ là phépcộng concat của giá trị record 3 cột đó lại với nhau

3.1.2 Cấu trúc chỉ mục trong MySQL

• Các loại index trong MySQL: Clustered - PRIMARY, UNIQUE (NOT NULL) Nếutrong table không có cả 2 loại trên thì MySQL sẽ tự tạo một clustered index ẩn tên làGEN_CLUST_INDEX trên một field ẩn tự động chứa id của các hàng (auto-increment,6-byte) Loại thứ 2: Secondary bao gồm các loại index còn lại: INDEX

• Loại cấu trúc của chỉ mục được hiện thực trong MySQL là BTREE, Các bản ghi chỉ mụcđược lưu trữ trong các trang lá của cấu trúc dữ liệu cây BTREE này Kích thước mặc địnhcủa trang chỉ mục là 16KB

• MySQL thực hiện tải hàng loạt thay vì chèn từng bản ghi chỉ mục khi tạo hoặc xây dựnglại chỉ mục Phương pháp tạo chỉ mục này còn được gọi là Sorted index build

Trang 15

• Có ba giai đoạn để xây dựng chỉ mục theo phương pháp trên Trong giai đoạn đầu, chỉmục cụm được quét, và các index entry được tạo và thêm vào bộ đệm sắp xếp Khi bộ đệmsắp xếp đầy, các entry sẽ được sắp xếp và ghi vào tệp trung gian tạm thời Quá trình nàycòn được gọi là ’run’ Trong giai đoạn thứ hai, với một hoặc nhiều lần run được ghi vàotệp trung gian tạm thời, merge sort được thực hiện trên tất cả entry trong tệp Trong giaiđoạn thứ ba và cũng là giai đoạn cuối cùng, các entry đã sắp xếp trong tệp được chèn vàoB-tree.

3.1.3 Các câu lệnh DDL liên quan đến index trong MySQL

• Ta có thể tạo index theo 2 cách: Chỉ định index ngay khi tạo table hoặc tạo index cho 1hay nhiều cột sau khi đã tạo table Ví dụ tạo bảng đồng thời gán index:

CREATE TABLE t(

c1 INT PRIMARY KEY,c2 INT NOT NULL,c3 INT NOT NULL,c4 VARCHAR(10),INDEX (c2,c3));

• Thêm index cho bảng, với index mang tính duy nhất và không thể null

ALTER TABLE tbl_name ADD PRIMARY KEY (column)

• Thêm index cho bảng, với index mang tính duy nhất nhưng có thể null

ALTER TABLE tbl_name ADD UNIQUE index_name (column_1, column_2, )

• Thêm index cho bảng, có thể trùng lặp

ALTER TABLE tbl_name ADD INDEX index_name (column_1, column_2, )

• Một chỉ mục có thể bị xóa bởi sử dụng lệnh DROP INDEX trong SQL nói chung

DROP INDEX index_name ON table_name

• Ngoài ra, index có thể được tạo mà chỉ dùng một phần của giá trị record trong column(Thay vì toàn bộ giá trị của record) Thông thường để sử dụng điều trên thì kiểu dữ thường

là là CHAR, VARCHAR, tức kiểu chuỗi kí tự Ví dụ tạo chỉ mục với chỉ 10 chữ cái đầutiên trong field name:

CREATE INDEX part_of_name ON customer (name(10));

• Nếu các giá trị trường field trong cột customer thường khác nhau trong 10 ký tự đầu tiên,thì việc tra cứu được thực hiện bằng chỉ mục này sẽ không chậm hơn nhiều so với việc sửdụng một chỉ mục được tạo từ toàn bộ cột tên Ngoài ra, việc sử dụng prefix cột cho cácchỉ mục có thể làm cho tệp chỉ mục nhỏ hơn nhiều, điều này có thể tiết kiệm nhiều dunglượng đĩa

Trang 16

3.1.4 Ví dụ minh họa:

• Giả sử ta có một table chứa thông tin về nhân viên với các field id, username, email, phone

và gender với khoảng 4 triệu bản ghi

• Ta sẽ thực hiện một câu lệnh SQL để query dữ liệu như sau:

SELECT * FROM‘users‘ WHERE ‘email‘ = ’useremail5cc26ebfeec1f@gmail.com’

• Nếu không sử dụng index thì cầu lệnh trên mất hơn 11s để trả về kết quả:

• Để xem MySQl xử lý câu lệnh đó chi tiết như thế nào, chúng ta sẽ thêm từ khóa EXPLAINphía trước câu truy vấn

EXPLAIN SELECT * FROM‘users‘ WHERE ‘email‘ = ’useremail5cc26ebfeec1f@gmail.com’

• Ở đây, ta chú ý đến thông tin quan trọng ở cột rows 4015335, tức số hàng mà MySQLphải duyệt qua để thực hiện câu query trên

• Bây giờ ta sẽ thêm index vào chính field email mà chúng ta sử dụng trong mệnh đề WHERE

ở trên Do email của mỗi người là duy nhất nên ta có thể đánh chỉ mục UNIQUE như sau:ALTER TABLE ‘users‘ ADD UNIQUE idx_email (‘email‘)

• Ta thực hiện xem lại chi tiết việc MySQL xử lí câu lệnh truy vấn cũ với index mới đượcthêm vào và thu được kết quả:

• Kết quả cho thấy MySQL chỉ phải duyệt qua 1 hàng giúp tiết kiệm thời gian một cáchđáng kể

3.2 Cassandra

• Vì Cassandra là một cơ sở dữ liệu phân tán và phi tập trung với dữ liệu được tổ chức theokhóa phân vùng (partition key), Trong trường hợp chung, để thực thi các câu truy vấnmệnh đề WHERE, tối thiểu chúng ta phải cung cấp đầy đủ khóa phân vùng Nếu như tathực thi câu truy vấn như tìm kiếm hoặc lọc trên các cột không chứa khóa phân vùng thìcâu truy vấn đó sẽ không được thực thi và sẽ xuất hiện lỗi

Ngày đăng: 06/04/2023, 09:30

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] So sánh kiểu CHAR và VARCHAR trong MySQLhttps://www.vertabelo.com/blog/comparing-char-and-varchar-data-types-in-different-database-engines/ Link
[2] Các kiểu dữ liệu trong MySQLhttps://openplanning.net/10321/du-lieu-va-cau-truc-trong-mysql[3] InnoDB storage enginehttps://dev.mysql.com/doc/internals/en/innodb.html[4] MySQL Indexex manualhttps://dev.mysql.com/doc/refman/5.7/en/innodb-indexes.html[5] Ví dụ về sử dụng index trong MySQLhttps://thlinh.com/cach-danh-index-co-ban-trong-mysql/ Link
[6] Khái niệm lập chỉ mục trong Apache Cassandrahttps://www.geeksforgeeks.org/concept-of-indexing-in-apache-cassandra/ Link
[7] Làm quen với Cassandra: Kiểu dữ liệu CQL và sử dụng GoCQLhttps://code.tutsplus.com/vi/tutorials/getting-started-with-cassandra-understanding-various-cql-data-types--cms-28110 Link
[8] Cassandra - Mô hình dữ liệuhttps://www.tutorialspoint.com/cassandra/cassandra_data_model.htm[9]https://8kmiles.com/blog/cassandra-backup-and-restore-methods/ Link
w