Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Giới thiệu về Chỉ mục SQL

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 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 , LastNameFirstName . 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 , LeagueMembership . 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 , LeagueMembership bảng.

  1. Từ Player bảng, PlayedID cột xác định duy nhất từng hàng dữ liệu. Tạo Player theo sau là một chỉ mục duy nhất trên PlayerId 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);
    
  2. Từ League bảng, LeagueId cột xác định duy nhất từng hàng dữ liệu. Tạo League theo sau là một chỉ mục duy nhất trên LeagueId 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);
    
  3. Từ Membership , cả PlayedIDLeagueId 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ạo Membership theo sau là một chỉ mục tổng hợp duy nhất trên PlayedIDLeagueId 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 (PlayedIdLeagueId ). 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 MembershipIndexPlayerIndex , 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ả FirstNameLastName . Kể từ sự kết hợp của FirstNameLastName 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ể.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql để chọn bản ghi theo tháng ngay cả khi dữ liệu không tồn tại

  2. MySQL ERROR 1045 (28000):Quyền truy cập bị từ chối đối với người dùng 'bill' @ 'localhost' (sử dụng mật khẩu:CÓ)

  3. LOAD DATA INFILE dễ dàng chuyển đổi YYYYMMDD sang YYYY-MM-DD?

  4. MySQL:Cách cho phép kết nối từ xa với mysql

  5. Làm cách nào để tạo một chỉ mục vào phần ngày của trường DATETIME trong MySql