Bài đăng trên blog này là phần thứ hai của loạt blog về các chỉ mục trong MySQL. Trong phần đầu tiên của loạt bài đăng trên blog về chỉ mục MySQL, chúng tôi đã đề cập đến khá nhiều thứ, bao gồm chúng là gì, chúng làm gì, kiểu của chúng là gì, cách chọn kiểu dữ liệu tối ưu và bộ ký tự MySQL cho chỉ mục mà bạn sử dụng. . Chúng ta đã xem xét những lợi ích và hạn chế của việc sử dụng các chỉ mục trong MySQL; chúng tôi đã cho bạn biết cách chọn chỉ mục tốt nhất để sử dụng, cách cải thiện hiệu suất truy vấn và đảm bảo MySQL sử dụng các chỉ mục của bạn, bạn nên có bao nhiêu chỉ mục. Chúng tôi cũng đã xem xét một số vấn đề liên quan đến công cụ lưu trữ. Bài đăng trên blog này sẽ đi vào chi tiết hơn về một số nội dung mà chúng ta đã thảo luận trong phần đầu của loạt bài. Chúng ta sẽ bắt đầu với mối tương quan giữa các chỉ mục và công cụ lưu trữ trong MySQL.
Chỉ mục và Công cụ lưu trữ trong MySQL
Như chúng tôi đã đề cập trong một bài đăng trên blog trước, có thể có một số loại giới hạn đối với chỉ mục và những thứ khác nếu bạn sử dụng một số công cụ lưu trữ nhất định trong MySQL. Đây là một số trong số chúng - bây giờ chúng ta sẽ xác định một số trong số chúng là gì (một số chúng đã được đề cập trong phần đầu tiên của loạt bài blog, vì vậy nếu chúng ta thiếu một cái gì đó thì có lẽ nó nằm trong đó), sau đó đề cập sâu hơn về chúng phân tích:
-
Theo tài liệu MySQL, số lượng chỉ mục tối đa, độ dài khóa tối đa và độ dài chỉ mục tối đa là được xác định cho mỗi công cụ lưu trữ. Như chúng tôi đã đề cập trong một bài đăng trên blog trước đó, số lượng chỉ mục tối đa trên mỗi bảng MyISAM và InnoDB là 64, số cột tối đa cho mỗi chỉ mục trong cả hai công cụ lưu trữ là 16, độ dài khóa tối đa cho InnoDB là 3500 byte và tối đa độ dài khóa cho MyISAM là 1000 byte.
-
Bạn không thể sử dụng CREATE INDEX để tạo một KHÓA CHÍNH - thay vào đó hãy sử dụng ALTER TABLE.
-
Các cột BLOB và TEXT chỉ có thể được lập chỉ mục cho các bảng chạy công cụ lưu trữ InnoDB, MyISAM và BLACKHOLE.
-
Nếu bạn chỉ lập chỉ mục một tiền tố của cột, hãy nhớ rằng hỗ trợ tiền tố và độ dài của chúng cũng phụ thuộc vào động cơ lưu trữ. Tiền tố có thể dài tới 767 byte đối với các bảng InnoDB sử dụng định dạng hàng REDUNDANT hoặc COMPACT, nhưng đối với các định dạng hàng DYNAMIC hoặc COMPRESSED, giới hạn độ dài tiền tố được tăng lên 3072 byte. Đối với bảng MyISAM, giới hạn độ dài tiền tố là 1000 byte. Công cụ lưu trữ NDB hoàn toàn không hỗ trợ tiền tố.
-
Nếu chế độ SQL nghiêm ngặt được bật và tiền tố chỉ mục vượt quá kích thước kiểu dữ liệu cột tối đa, CREATE INDEX sẽ ném một lỗi. Nếu một chế độ SQL nghiêm ngặt không được bật, CREATE INDEX sẽ đưa ra một cảnh báo. Nếu một INDEX UNIQUE được tạo, sẽ xảy ra lỗi.
-
Nói chung, MySQL chỉ cho phép bạn tạo tối đa 16 chỉ mục trên một bảng nhất định.
-
Nếu bạn đang sử dụng chỉ mục KHÓA CHÍNH, bạn chỉ có thể có một khóa chính cho mỗi bảng. FULLTEXT, UNIQUE INDEXes và INDEXes không có giới hạn này.
-
Nếu bạn đang sử dụng chỉ mục FULLTEXT, hãy nhớ rằng chúng chỉ có thể được sử dụng cho các công cụ lưu trữ InnoDB hoặc MyISAM và cho các cột CHAR, VARCHAR hoặc TEXT. Cũng nên nhớ rằng MySQL chỉ sử dụng các chỉ mục FULLTEXT khi các mệnh đề MATCH () AGAINST () được sử dụng và bạn thực sự có thể có một chỉ mục và chỉ mục văn bản đầy đủ trên cùng một cột cùng một lúc nếu bạn muốn và các chỉ mục FULLTEXT có bộ từ dừng riêng cho từng công cụ lưu trữ đang được sử dụng.
-
Chỉ mục B-Tree có thể hữu ích nếu bạn sử dụng các truy vấn LIKE bắt đầu bằng ký tự đại diện, nhưng chỉ trong một số các tình huống.
Biết những giới hạn chỉ mục này sẽ tỏ ra hữu ích nếu bạn đang cố gắng hiểu cách hoạt động của các chỉ mục trong MySQL. Điều quan trọng hơn cần hiểu là bạn phải xác minh rằng các chỉ mục của bạn thực sự được sử dụng bởi MySQL. Chúng tôi đã đề cập ngắn gọn về vấn đề này trong phần đầu tiên của loạt bài này (“Cách chọn chỉ mục tốt nhất để sử dụng?”), Nhưng chúng tôi chưa cho bạn biết cách xác minh rằng chỉ mục của bạn thực sự được sử dụng bởi MySQL. Để làm điều đó, hãy xác minh việc sử dụng chúng bằng cách sử dụng EXPLAIN - khi EXPLAIN được sử dụng cùng với một câu lệnh có thể giải thích được, MySQL sẽ hiển thị thông tin từ trình tối ưu hóa về kế hoạch thực thi của câu lệnh.
Cân nhắc CHÍNH CHỦ YẾU
Một số cân nhắc cơ bản liên quan đến chỉ mục CHÍNH CHÍNH TRONG MySQL bao gồm thực tế là chúng chủ yếu được sử dụng để xác định duy nhất các bản ghi trong bảng và thường được sử dụng với các giá trị AUTO_INCREMENTing nghĩa là chúng có thể rất hữu ích nếu bạn đang tạo trường ID. Các trường KHÓA CHÍNH phải chứa các giá trị duy nhất và chúng không được chứa các giá trị NULL.
Đối sánh Tiền tố Cột
Chỉ mục cũng có thể khớp với tiền tố cột. Cách tiếp cận chỉ mục này có thể hữu ích nếu các cột của bạn là cột chuỗi và bạn nghĩ rằng việc thêm chỉ mục trên toàn bộ cột sẽ có khả năng tiêu tốn nhiều dung lượng đĩa. Các chỉ mục của bạn có thể khớp với tiền tố cột như sau:
ALTER TABLE demo_table ADD INDEX index_name(column_name(length));
Truy vấn trên sẽ thêm một chỉ mục index_name trên một cột có tên là column_name chỉ cho một tiền tố cột được xác định. Để chọn lượng độ dài phù hợp để lập chỉ mục, hãy đảm bảo rằng việc sử dụng tiền tố của bạn tối đa hóa tính duy nhất của các giá trị trong cột:tìm số hàng trong bảng và đánh giá các độ dài tiền tố khác nhau cho đến khi bạn đạt được tính duy nhất mong muốn của các hàng.
Chỉ mục FULLTEXT trong MySQL
Các chỉ mục FULLTEXT trong MySQL hoàn toàn là một con thú khác. Chúng có nhiều hạn chế riêng (ví dụ:InnoDB có danh sách từ dừng bao gồm 36 từ trong khi danh sách từ dừng của MyISAM bao gồm 143 từ), chúng cũng có các chế độ tìm kiếm độc đáo. Một số trong số chúng bao gồm chế độ ngôn ngữ tự nhiên (để kích hoạt chế độ tìm kiếm như vậy, hãy chạy truy vấn tìm kiếm FULLTEXT mà không có công cụ sửa đổi), bạn cũng có thể mở rộng tìm kiếm của mình (để làm điều đó, hãy sử dụng công cụ sửa đổi VỚI MỞ RỘNG - một chế độ tìm kiếm như vậy sẽ thực hiện tìm kiếm hai lần, nhưng khi tìm kiếm chạy lần thứ hai, nó bao gồm một vài bản ghi có liên quan nhất từ lần tìm kiếm đầu tiên - thường được sử dụng khi người dùng đã ngụ ý biết về điều gì đó), để tìm kiếm với toán tử boolean, hãy sử dụng công cụ sửa đổi IN BOOLEAN MODE. Chỉ mục FULLTEXT cũng sẽ chỉ được sử dụng nếu truy vấn tìm kiếm bao gồm tối thiểu ba ký tự cho InnoDB và tối thiểu bốn ký tự cho MyISAM.
Sử dụng Chỉ mục Cây B với Ký tự đại diện
Chỉ mục cũng thường được sử dụng nếu bạn đang xây dựng thứ gì đó tương tự như công cụ tìm kiếm. Đối với điều đó, bạn thường chỉ muốn tìm kiếm một phần của giá trị và trả về kết quả - đây là nơi các ký tự đại diện bước vào. Một truy vấn đơn giản sử dụng ký tự đại diện sử dụng truy vấn LIKE và dấu% để biểu thị “bất kỳ thứ gì” sau văn bản. Ví dụ:một truy vấn như vậy sẽ tìm kiếm các kết quả bắt đầu bằng từ “tìm kiếm” và có bất kỳ thứ gì sau nó:
SELECT * FROM … WHERE demo_column LIKE ‘search%’;
Một truy vấn như vậy sẽ tìm kiếm các kết quả bắt đầu bằng bất kỳ thứ gì, có từ "tìm kiếm" và có bất kỳ thứ gì sau nó:
SELECT * FROM … WHERE demo_column LIKE ‘%search%’;
Nhưng đây là một giải pháp - truy vấn trên sẽ không sử dụng chỉ mục. Tại sao? Bởi vì nó có một ký tự đại diện ở đầu của chính nó và MySQL không thể tìm ra những gì cột cần bắt đầu. Đó là lý do tại sao chúng tôi nói rằng chỉ mục ký tự đại diện có vị trí của chúng, nhưng chỉ trong các trường hợp cụ thể - tức là các trường hợp như vậy mà bạn không có ký tự đại diện ở đầu truy vấn tìm kiếm của mình.
Sử dụng ClusterControl để theo dõi hiệu suất của các truy vấn
Ngoài việc sử dụng EXPLAIN, bạn cũng có thể sử dụng ClusterControl để theo dõi hiệu suất của các truy vấn của mình:ClusterControl cung cấp một tập hợp các tính năng giám sát và báo cáo nâng cao cho phép bạn theo dõi hiệu suất của các phiên bản và truy vấn cơ sở dữ liệu của mình . Ví dụ:nhấp vào một cụm và bạn sẽ thấy tab “Giám sát truy vấn”. Nhấp vào nó và ClusterControl sẽ cho phép bạn quan sát trạng thái của các truy vấn trong các phiên bản cơ sở dữ liệu của bạn:
Phần này của ClusterControl cho phép bạn xem danh sách các đang chạy các truy vấn đồng thời cho phép bạn lọc qua chúng. Ví dụ:nếu bạn biết rằng cách đây không lâu, bạn đã chạy một truy vấn bao gồm @@ log_bin, bạn có thể chỉ cần tìm kiếm cụm từ đó và ClusterControl sẽ trả về một danh sách kết quả:
Như bạn có thể nhận thấy, bạn cũng có thể lọc các truy vấn theo máy chủ mà bạn sử dụng hoặc theo số lần xuất hiện, bạn cũng có thể chọn xem một tập hợp các hàng, ví dụ:20, 100 hoặc 200. ClusterControl cũng sẽ cho bạn biết khi nào truy vấn được nhìn thấy lần cuối, tổng thời gian thực thi của nó, bao nhiêu hàng mà nó đã trả về, nó đã kiểm tra bao nhiêu hàng và cứ tiếp tục như vậy. ClusterControl có thể chứng minh là một công cụ nếu bạn muốn quan sát cách các chỉ mục của mình thực sự được sử dụng bởi các phiên bản MySQL, MariaDB, MongoDB, PostgreSQL hoặc TimescaleDB.
Tóm tắt
Trong bài đăng trên blog này, chúng tôi đã xem xét một số hạn chế và lợi ích liên quan đến các chỉ mục trong MySQL và chúng tôi cũng đã đề cập đến cách ClusterControl có thể giúp bạn đạt được các mục tiêu về hiệu suất cơ sở dữ liệu của mình. Chúng tôi cũng sẽ có phần thứ ba về các chỉ mục trong MySQL đi sâu hơn vào chúng, nhưng để kết luận những gì chúng tôi đã đề cập cho đến nay, hãy nhớ rằng các chỉ mục trong MySQL chắc chắn có vị trí riêng của chúng - để tận dụng chúng tốt nhất, hãy biết cách chúng tương tác với các công cụ lưu trữ, lợi ích và hạn chế của chúng, cách thức và thời điểm sử dụng các loại chỉ mục nhất định và lựa chọn một cách khôn ngoan.