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

Hiệu suất MySQL:Chỉ mục MySQL / MariaDB

Dữ liệu trong cơ sở dữ liệu MySQL / MariaDB được lưu trữ trong các bảng. Một cách nghĩ đơn giản về chỉ mục là hình dung một bảng tính mở rộng. Loại hệ thống này không phải lúc nào cũng có lợi cho việc tìm kiếm nhanh chóng; đó là nơi mà một chỉ mục trở nên cần thiết. Nếu không có chỉ mục, thì công cụ cơ sở dữ liệu phải bắt đầu ở hàng một và duyệt qua tất cả các hàng để tìm các giá trị tương ứng. Nếu đây là một bảng nhỏ thì không có gì to tát, nhưng trong các bảng lớn hơn và các ứng dụng, nơi có thể có các bảng với hàng triệu và thậm chí hàng tỷ hàng, thì nó sẽ trở thành vấn đề. Như bạn có thể tưởng tượng, việc tìm kiếm từng hàng một sẽ tốn thời gian, ngay cả trên phần cứng mới nhất. Giải pháp là tạo một INDEX (hoặc nhiều hơn một) cho dữ liệu của bạn.

Chỉ mục là gì?

Chỉ mục là một bảng tra cứu có tổ chức chứa các con trỏ đến nơi dữ liệu có thể được truy xuất trong cơ sở dữ liệu. Khái niệm này tương tự như mục lục sách. Trong một cuốn sách, chỉ mục liệt kê các số trang chứa các chủ đề khác nhau. Trong cơ sở dữ liệu, chỉ mục lưu trữ các con trỏ theo thứ tự logic và được sắp xếp, cho phép tra cứu nhanh chóng trong cơ sở dữ liệu. Hãy tưởng tượng một cuốn sách không có mục lục. Nếu bạn muốn tra cứu thông tin về một chủ đề cụ thể, bạn phải bắt đầu từ đầu và lật qua các trang cho đến khi bạn tìm thấy thông tin cần tìm. Mục lục sách giải quyết vấn đề này bằng cách cho bạn biết chính xác thông tin bạn đang tìm kiếm ở những trang nào. Về cơ bản đây là cách hoạt động của chỉ mục MySQL.

Khi nào thì MySQL sử dụng chỉ mục?

Bất cứ lúc nào máy chủ cơ sở dữ liệu phải tra cứu thông tin, nó sẽ sử dụng một chỉ mục để tăng tốc quá trình. Ví dụ về điều này bao gồm mệnh đề WHERE, JOIN ON, MIN / MAX và ORDER BY / GROUP BY. Nếu các truy vấn của bạn thường xuyên tìm kiếm hoặc khớp một cột trong bất kỳ trường hợp nào trong số này, bạn nên cân nhắc tạo chỉ mục.

Các chỉ mục có cải thiện hiệu suất cơ sở dữ liệu không?

Hầu hết thời gian, câu trả lời ngắn gọn là có. Đối với các lần đọc và tìm kiếm thông qua dữ liệu, các chỉ mục hoàn toàn tăng hiệu suất. Việc không quét toàn bộ bảng sẽ cải thiện bất kỳ truy vấn SELECT nào. Điều này đi kèm với một cái giá nhỏ. Đối với các cột thường được thao tác, sẽ có chi phí cho mỗi lần thay đổi. Điều này có thể làm hỏng các CHÈN và CẬP NHẬT trên cơ sở dữ liệu.

Các loại chỉ mục MySQL phổ biến

Có ba loại chỉ mục MySQL phổ biến:

  • Khóa chính
  • Chỉ mục
  • Độc đáo

TỪ KHÓA CHÍNH

Khóa chính cho máy chủ cơ sở dữ liệu biết đâu là (các) cột quan trọng nhất trong bảng. Thông thường, điều này được sử dụng cho các cột id auto_increment. Ví dụ:nếu bạn có một bảng chứa thông tin nhân viên, bạn sẽ muốn có khóa chính trên cột “EMPLOYEE_ID”. Trong các bảng khác, tức là bảng lương, bạn chỉ cần tham chiếu đến EMPLOYEE_ID thay vì tất cả dữ liệu của nhân viên.

INDEX

INDEX tiêu chuẩn được sử dụng để cho máy chủ cơ sở dữ liệu biết rằng một hoặc nhiều cột trong bảng sẽ được tìm kiếm rất nhiều và do đó một chỉ mục sẽ được tạo trên chúng. Điều này có thể được xây dựng trong quá trình tạo bảng hoặc nếu bạn thấy bạn cần một chỉ mục trên một cột sau đó, nó có thể được thêm vào sau đó.

DUY NHẤT

Chỉ mục UNIQUE hơi khác biệt ở chỗ nó đặt các ràng buộc cụ thể về những gì có thể được ghi vào bảng. Nếu bạn cố gắng chèn một hàng có chứa giá trị đã được bao gồm trong dữ liệu, thì INSERT sẽ tạo ra lỗi. Điều này cho phép tìm kiếm nhanh chóng cũng như tính toàn vẹn của một số dữ liệu.

Cách tạo chỉ mục

Có nhiều cách để tạo chỉ mục trên một cột. Bạn có thể thiết lập chỉ mục khi tạo BẢNG hoặc sau đó bằng câu lệnh ALTER TABLE hoặc CREATE INDEX.

Tạo chỉ mục CHÍNH CHÍNH

Cách dễ nhất để tạo chỉ mục CHÍNH CHÍNH là thực hiện khi bạn tạo bảng. Chúng tôi sẽ sử dụng một ví dụ về bảng nhân viên cho hướng dẫn này. Bảng sẽ có ba cột:ID, FIRSTNAME và LASTNAME. Tạo có thể trông giống như sau:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32)
);

Câu lệnh này sẽ tạo bảng mà không có chỉ mục. Chúng ta có thể thêm khóa chính bằng một câu lệnh như sau:

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT PRIMARY KEY (ID);

Điều này cho MySQL biết rằng chúng ta có một khóa chính trên ID cột.

Một cách đơn giản hơn để làm điều này là trong quá trình tạo bảng. Bắt đầu lại, chúng tôi sẽ tạo lại bảng và thêm khóa chính trong một câu lệnh.

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Câu lệnh đơn này thực hiện các nhiệm vụ tương tự như hai câu lệnh đầu tiên ở trên. Một khóa chính có thể chứa nhiều hơn một cột, nhưng tất cả các cột phải là duy nhất. Khóa chính có thể được sử dụng để xác định bất kỳ hàng riêng lẻ nào trong bảng.

Tạo chỉ mục bằng cách sử dụng CREATE INDEX

Sử dụng bảng ví dụ trên, hãy tưởng tượng rằng công ty có hàng nghìn nhân viên và bạn muốn có thể tìm kiếm nhanh chóng các nhân viên theo họ. Với khóa chính, chỉ có thể có một mục nhập. Bạn không thể có nhiều người có cùng ID nhân viên. Với họ, việc nhiều người dùng chung tên đó là điều khá phổ biến. Một lần nữa, có một số cách để làm điều này. Sử dụng bảng trên:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Chúng tôi có thể thêm một chỉ mục vào cột LASTNAME như sau:

CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);

Các tìm kiếm của LASTNAME giờ đây sẽ nhanh hơn trên bảng này. Trong ví dụ này, “idx1” là tên của chỉ mục. Điều này sẽ giúp chúng ta dễ dàng tham chiếu chỉ số hơn trong tương lai nếu chúng ta cần.

Một cách khác để thêm chỉ mục vào bảng là sử dụng lệnh ALTER TABLE. Để thực hiện điều tương tự chúng ta đã làm với câu lệnh trước, chúng ta sẽ chạy lệnh sau:

ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);

Cách cuối cùng để thêm chỉ mục sẽ tiết kiệm thời gian là thực hiện nó trong TẠO BẢNG. Nếu bạn biết trước rằng bạn sẽ tìm kiếm hoặc tham gia vào một cột cụ thể thì bạn có thể tạo bảng ban đầu với chỉ mục đã có ở đó:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx1 (LASTNAME)
);

Cả ba câu lệnh này đều tạo ra cùng một kết quả.

Chỉ mục nhiều cột

Chỉ mục không nhất thiết phải nằm trên một cột duy nhất. Nếu chúng tôi muốn tra cứu nhanh hơn trên cả FIRSTNAME và LASTNAME, chúng tôi có thể tạo chỉ mục trên cả hai cột. Trong bảng tạo, nó sẽ giống như sau:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx2 (LASTNAME,FIRSTNAME)
);

Sử dụng lệnh CREATE INDEX:

CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);

Và cuối cùng, lệnh ALTER TABLE:

ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);

Tạo CHỈ SỐ DUY NHẤT

Có thể đôi khi bạn muốn tạo chỉ mục trên một cột và cũng buộc tất cả các mục nhập trong cột đó là duy nhất. Nếu chúng tôi mở rộng bảng ví dụ của mình để bao gồm cột VĂN PHÒNG (biểu thị văn phòng nào trong tòa nhà mà họ có), thì chúng tôi có thể muốn đặt chỉ mục này thành chỉ mục DUY NHẤT. Hãy làm việc với bảng này:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  OFFICE INT,
  PRIMARY KEY (ID)
);

Lưu ý rằng bây giờ chúng ta có một số nguyên được lưu trữ trong bảng để biểu thị văn phòng mà người đó làm. Bảng này có thể đề cập đến một bảng khác, “CÁC VĂN PHÒNG”, bảng này sẽ chứa thông tin về các văn phòng khác nhau trong tòa nhà.

Để tạo một chỉ mục về điều này, chúng tôi sẽ sử dụng lệnh sau:

CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);

Bạn có thể sử dụng các lệnh tương tự để tạo các lệnh này trong lệnh CREATE TABLE và ALTER TABLE. Bây giờ nếu bạn đã cố gắng chạy hai chèn này:

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);

Bạn sẽ nhận được lỗi trong lần CHÈN thứ hai:

Duplicate entry '1' for key 'idx3'

Xóa chỉ mục

Có thể có lúc bạn không muốn chỉ mục trên một cột nữa. Có lẽ bạn đã nhận ra rằng bạn không thường xuyên tìm kiếm một cột và chỉ mục đang làm chậm quá trình chèn và cập nhật. Để làm điều này, chúng tôi sẽ sử dụng lệnh DROP INDEX. Bảng của chúng tôi đã được tạo như thế này:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR,
  LASTNAME CHAR,
  PRIMARY KEY (ID),
  INDEX idx (LASTNAME,FIRSTNAME)
);

Nếu chúng tôi muốn xóa chỉ mục trên các cột LASTNAME và FIRSTNAME, chúng tôi sẽ đưa ra lệnh này:

DROP INDEX IDX ON EMPLOYEE;

Kết luận

Chỉ mục cơ sở dữ liệu là một công cụ cơ bản tối ưu hóa tốc độ truy xuất dữ liệu trong một cấu trúc tận dụng hiệu suất tìm kiếm và đọc trong một bảng. Nâng cao chỉ mục chủ yếu được thúc đẩy với chi phí ghi nhiều hơn và / hoặc không gian lưu trữ để duy trì cấu trúc dữ liệu chỉ mục tối ưu.

Cơ sở dữ liệu MySQL và MariaDB cung cấp nhiều tùy chọn tìm kiếm và đọc khác, bao gồm nhiều tùy chọn không được đề cập ở đây. Những điểm cần rút ra ở đây bao gồm:

  • Đảm bảo bạn dành thời gian để lập kế hoạch trước các bảng của mình.
  • Nếu bạn không lập kế hoạch trước khi tạo bảng, hãy đánh giá các cột đang được tìm kiếm nhiều nhất và tạo chỉ mục cho chúng.

Hãy xem nó đang hoạt động!

Dòng máy chủ chuyên dụng rộng rãi của chúng tôi cung cấp sức mạnh, sự ổn định và bảo mật cần thiết để lưu trữ cơ sở dữ liệu nhỏ nhất cho các doanh nghiệp đang phát triển lên đến một máy chủ cụm có tính khả dụng cao được thiết lập cho các tập đoàn lớn nhất. Bạn muốn xem những giải pháp nào chúng tôi có thể cung cấp để đáp ứng nhu cầu của bạn?

Hãy gọi cho chúng tôi theo số 800.580.4985, hoặc mở cuộc trò chuyện hoặc đặt vé với chúng tôi để nói chuyện với một trong những cố vấn Giải pháp hoặc Dịch vụ lưu trữ có kinh nghiệm của chúng tôi để tìm hiểu cách bạn có thể tận dụng công nghệ này ngay hôm nay!

Điều hướng chuỗi <>

  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 - Các phương pháp khác nhau để biết người dùng hiện tại

  2. Neo4j - Xóa mối quan hệ bằng Cypher

  3. Thiết lập Django để sử dụng MySQL

  4. Cách di chuyển từ Oracle sang MySQL / Percona Server

  5. Cách tính Doanh thu trong MySQL