Trong hệ thống cơ sở dữ liệu quan hệ, một chỉ mục cơ sở dữ liệu là một công cụ cực kỳ mạnh mẽ để truy xuất dữ liệu. Trong hướng dẫn này, bạn tìm hiểu về các chỉ mục duy nhất, khóa chính và khóa chính tổng hợp.
Chỉ mục cơ sở dữ liệu là gì?
A Chỉ mục cơ sở dữ liệu là một đối tượng cấu trúc dữ liệu được liên kết với một bảng cơ sở dữ liệu. Nó được sử dụng để tăng tốc độ truy vấn cơ sở dữ liệu (thông qua SQL SELECT
yêu cầu). Nói chung, có các phương pháp được xác định rõ ràng để quyết định loại chỉ mục để tạo. Điều này phần lớn bị chi phối bởi cách các bảng trong cơ sở dữ liệu liên quan với nhau và cách dữ liệu được truy xuất.
Tại sao sử dụng Chỉ mục?
Nói chung, các truy vấn (hoặc tra cứu) trong một bảng thông qua SQL SELECT
lệnh là tuần tự. Tra cứu tuần tự yêu cầu bắt đầu từ đầu bảng và đọc mọi hàng dữ liệu cho đến khi dữ liệu mong muốn được truy xuất. Điều này cực kỳ kém hiệu quả và có thể là một hoạt động tốn kém về tốc độ.
Mặt khác, các chỉ mục sử dụng hàm băm để tính giá trị chỉ mục. Nó cung cấp quyền truy cập trực tiếp vào hàng (khóa) bị ảnh hưởng trong chỉ mục. Khi hàng (khóa) đó được đặt trong chỉ mục, bản ghi chỉ mục có một con trỏ trực tiếp đến hàng của bảng được yêu cầu trong truy vấn. Các con trỏ này được thiết lập trong quá trình tạo chỉ mục và duy trì chỉ mục. Tốc độ truy xuất dữ liệu khi sử dụng các chỉ mục được tăng lên theo thứ tự độ lớn.
Giải phẫu của một chỉ mục cơ sở dữ liệu duy nhất
Một bảng cơ sở dữ liệu có thể có một hoặc nhiều chỉ mục được liên kết. Các chỉ mục tự giữ các giá trị hàng (khóa) từ một hoặc nhiều cột trong bảng. Nó cũng có một con trỏ trỏ đến các hàng bảng thực tế có chứa các giá trị chính này. Số hàng được trỏ đến bởi một khóa nhất định trong chỉ mục phụ thuộc vào việc chỉ mục đó có phải là chỉ mục duy nhất hay không hoặc một chỉ mục không phải duy nhất .
Như tên của nó, một chỉ mục duy nhất chứa các khóa trỏ đến chỉ một hàng dữ liệu trong một bảng nhất định. Chỉ mục duy nhất đảm bảo rằng mỗi hàng trong bảng chứa các giá trị duy nhất trong các cột bảng được lập chỉ mục đã xác định. Một cách hiệu quả, không có hai hàng nào có thể có các giá trị giống nhau trong các cột được lập chỉ mục. Hơn nữa, các chỉ mục duy nhất được tạo trên các cột được chỉ định làm khóa chính cho bảng. Khóa chính được định nghĩa là một hoặc nhiều cột xác định duy nhất một hàng trong bảng cơ sở dữ liệu.
Các ví dụ dưới đây chứng minh cách sử dụng khóa chính và chỉ mục duy nhất trong SQL. Tất cả các ví dụ sử dụng một bảng có tên Student
, trong cơ sở dữ liệu mẫu có tên exampledb
. Để thêm dữ liệu mẫu, hãy sử dụng lệnh sau:
INSERT INTO Student(SSNumber, LastName, FirstName)
VALUES
(111111111, Smith, John),
(222222222, Jones, Mary),
(333333333, Hansen, Robert);
Xem dữ liệu được lưu trữ trong Student
bảng:
SELECT * FROM Student;
Bạn sẽ thấy kết quả sau:
+-----------+----------+-----------+
| SSNumber | LastName | FirstName |
+-----------+----------+-----------+
| 111111111 | Smith | John |
| 222222222 | Jones | Mary |
| 333333333 | Hansen | Robert |
+-----------+----------+-----------+
Lưu ý Trừ khi được đề cập khác, tất cả các lệnh trong hướng dẫn này hoạt động tốt trên cả MySQL và PostgreSQL cơ sở dữ liệu.
Khóa và chỉ mục chính của cột duy nhất
Ví dụ:giả sử rằng một trường học theo dõi học sinh của mình trong một bảng có tên Student
. Bảng này có các cột được liên kết có tên là Student
, SSNumber
, LastName
và FirstName
. Từ các cột này, Student
là cột khóa chính vì nó xác định duy nhất từng hàng dữ liệu trong Student
bàn. Tạo một chỉ mục duy nhất (SSIndex
) trên SSNumber
để tạo điều kiện truy xuất dữ liệu từ bảng một cách nhanh chóng. Lệnh SQL DDL sau được sử dụng để thực hiện truy vấn này:
TẠO BẢNG Sinh viên (SSNumber CHAR (9) NOT NULL, LastName VARCHAR (30) NOT NULL, FirstName VARCHAR (20) NOT NULL, PRIMARY KEY (SSNumber));
CREATE UNIQUE INDEX SSIndex ON Student (SSNumber);
Lưu ý Cả hai lệnh SQL ở trên đều được phân tách bằng dấu chấm phẩy (;), tương thích với hầu hết các hệ thống cơ sở dữ liệu quan hệ. SSNumber
được chỉ định cụ thể làm khóa chính của bảng.
SSIndex
chỉ chứa thông tin nhận dạng duy nhất dữ liệu trong mỗi hàng của Student
bàn. Mỗi hàng của SSIndex
có một con trỏ đến hàng tương ứng của nó trong Student
bàn. SSIndex
này chỉ mục cho phép bạn tránh tìm kiếm tuần tự dữ liệu trong bảng để cải thiện hiệu suất bằng cách giảm thiểu thời gian cần thiết cho truy vấn.
Để tìm thông tin liên quan cho Robert Hansen
thông qua SSNumber
của họ , sử dụng lệnh SQL được bao gồm bên dưới. Lệnh không chỉ loại bỏ tìm kiếm tuần tự của Student
nhưng cũng sử dụng SSIndex
để cung cấp quyền truy cập trực tiếp vào hàng dữ liệu cần thiết. Điều này là do sử dụng hàm băm và con trỏ chỉ mục được liên kết.
SELECT * FROM Student WHERE SSNumber = 333333333;
Dữ liệu trả về phải như sau:
+-----------+----------+-----------+
| SSNumber | LastName | FirstName |
+-----------+----------+-----------+
| 333333333 | Hansen | Robert |
+-----------+----------+-----------+
Khóa chính và chỉ mục tổng hợp nhiều cột
Các ví dụ của phần này sử dụng ba bảng lưu trữ dữ liệu liên quan đến một giải đấu quần vợt. Ba bảng được đặt tên là Player
, League
và Membership
. Một người chơi có thể chơi ở nhiều giải đấu và bảng thành viên cung cấp sự liên kết đó. Ba bảng có các cột sau được liên kết với chúng:
Các cột của Player
bảng được hiển thị bên dưới với PlayedID
làm khóa chính.
+----------+-----------+-----------+
| PlayedID | LastName | FirstName |
+----------+-----------+-----------+
Các cột của League
bảng được hiển thị bên dưới với LeagueId
làm khóa chính.
+----------+------------+------------+
| LeagueId | LeagueName | SkillLevel |
+----------+------------+------------+
Các cột của Membership
bảng được hiển thị bên dưới
+----------+-----------+
| PlayedID | LeagueId |
+----------+-----------+
Các bước bên dưới hướng dẫn bạn cách tạo Player
, League
và Membership
bảng.
-
Từ
Player
bảng,PlayedID
cột xác định duy nhất từng hàng dữ liệu. TạoPlayer
theo sau là một chỉ mục duy nhất trênPlayerId
cột.CREATE TABLE Player ( PlayedID INT NOT NULL, LastName VARCHAR(30) NOT NULL, FirstName VARCHAR(20) NOT NULL, PRIMARY KEY (PlayedID) ); CREATE UNIQUE INDEX PlayerIndex ON Player (PlayedID);
-
Từ
League
bảng,LeagueId
cột xác định duy nhất từng hàng dữ liệu. TạoLeague
theo sau là một chỉ mục duy nhất trênLeagueId
cột. Sau đây là lệnh SQL để thực hiện thao tác này:CREATE TABLE League ( LeagueId INT NOT NULL, LeagueName VARCHAR(50) NOT NULL, SkilLevel VARCHAR(20) NOT NULL, PRIMARY KEY (LeagueId) ); CREATE UNIQUE INDEX LeagueIndex ON League (LeagueId);
-
Từ
Membership
, cảPlayedID
vàLeagueId
các cột xác định duy nhất từng hàng dữ liệu; là khóa chính tổng hợp. TạoMembership
theo sau là một chỉ mục tổng hợp duy nhất trênPlayedID
vàLeagueId
cột.CREATE TABLE Membership ( PlayerId INT NOT NULL, LeagueId INT NOT NULL, PRIMARY KEY(PlayerId, LeagueId) ); CREATE UNIQUE INDEX MembershipIndex ON Membership (PlayerId, LeagueId);
MembershipIndex
là một chỉ mục được tạo băm bao gồm Khóa tổng hợp (PlayedId
và LeagueId
). Nó có các con trỏ đến các hàng dữ liệu mà nó đại diện. Việc sử dụng chỉ mục như vậy tạo điều kiện cho việc truy xuất dữ liệu truy cập trực tiếp, nhanh chóng, trái ngược với truy xuất dữ liệu tuần tự tuyến tính. Ví dụ:để xác định tất cả những người chơi được liên kết với “Đôi nam” từ một số bản ghi trong mỗi bảng ở trên, bạn có thể đưa ra lệnh SQL sau:
SELECT Player.LastName, Player.Firstname
FROM Player, Membership
WHERE Membership.LeagueId = 2
AND Membership.PlayerId = Player.PlayerId
Dữ liệu sau được trả về:
+----------+-----------+
| LastName | FirstName |
+----------+-----------+
| Smith | John |
| Hansen | Robert |
+-----------+----------+
Không sử dụng MembershipIndex
và PlayerIndex
, truy vấn ở trên sẽ thực thi chậm hơn đáng kể.
Không phải duy nhất
Chỉ mục không phải là duy nhất chứa các mục nhập có thể trỏ đến một hoặc nhiều hàng cho bất kỳ giá trị khóa nhất định nào. Ví dụ:để tìm kiếm theo tên của một người, cần tạo chỉ mục tổng hợp không duy nhất trên bảng cho cả FirstName
và LastName
. Kể từ sự kết hợp của FirstName
và LastName
không thể được đảm bảo là duy nhất, chỉ mục kết quả được tạo trên hai cột đó sẽ tạo ra một chỉ mục không phải là duy nhất một cách hiệu quả.
Vấn đề Suy giảm Hiệu suất Cơ sở dữ liệu Sử dụng Chỉ mục
Trong khi các chỉ mục hỗ trợ tốc độ thực thi truy vấn, chúng cần được cập nhật bất cứ khi nào các cột được lập chỉ mục thay đổi hoặc khi các hàng trong bảng được thêm vào hoặc xóa khỏi cơ sở dữ liệu. Điều này có thể gây bất lợi cho hiệu suất của cơ sở dữ liệu. Điều quan trọng cần lưu ý là phải chèn, xóa và sửa đổi chỉ mục của bạn trong quá trình sử dụng cơ sở dữ liệu giao dịch. Xem xét điều gì là quan trọng đối với bạn trong ứng dụng cơ sở dữ liệu; tốc độ thực thi truy vấn hoặc tốc độ thao tác dữ liệu. Câu trả lời cho câu hỏi đó nằm ở cách ứng dụng cơ sở dữ liệu được sử dụng, tần suất nó ảnh hưởng đến thiết kế của cơ sở dữ liệu và số lượng chỉ mục được tạo.
Kết luận
Việc tạo và sử dụng chỉ mục cơ sở dữ liệu tạo ra các phản hồi truy xuất truy vấn nhanh chóng và loại bỏ việc tra cứu hàng tuần tự khỏi bảng. Tuy nhiên, việc duy trì chỉ mục thông qua thao tác dữ liệu có thể có tác động bất lợi đến hiệu suất trên cơ sở dữ liệu. Các nhà thiết kế cơ sở dữ liệu cần nhận thức được những đánh đổi liên quan khi sử dụng các chỉ mục cơ sở dữ liệu và ghi nhớ việc tối ưu hóa cho hiệu suất cơ sở dữ liệu tổng thể.