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

Hiểu các chỉ mục trong MySQL:Phần một

Chỉ mục trong MySQL là một con thú rất phức tạp. Chúng tôi đã đề cập đến các chỉ mục MySQL trong quá khứ, nhưng chúng tôi chưa bao giờ đi sâu hơn vào chúng - chúng tôi sẽ làm điều đó trong loạt bài đăng trên blog này. Bài đăng trên blog này sẽ hoạt động như một hướng dẫn rất chung về chỉ mục trong khi các phần khác của loạt bài này sẽ đi sâu hơn một chút về các chủ đề này.

Chỉ mục là gì?

Nói chung, như đã được lưu ý trong một bài đăng trên blog trước đó về chỉ mục, chỉ mục là danh sách các bản ghi theo thứ tự bảng chữ cái có tham chiếu đến các trang mà chúng được đề cập. Trong MySQL, chỉ mục là cấu trúc dữ liệu được sử dụng phổ biến nhất để tìm nhanh các hàng. Bạn cũng có thể nghe thấy thuật ngữ “khóa” - nó cũng dùng để chỉ các chỉ mục.

Chỉ mục làm gì?

Trong MySQL, chỉ mục được sử dụng để tìm nhanh các hàng có giá trị cột cụ thể và ngăn việc đọc toàn bộ bảng để tìm bất kỳ hàng nào có liên quan đến truy vấn. Chỉ mục chủ yếu được sử dụng khi dữ liệu được lưu trữ trong hệ thống cơ sở dữ liệu (ví dụ:MySQL) càng lớn vì bảng càng lớn, xác suất bạn có thể hưởng lợi từ chỉ mục càng lớn.

Loại Chỉ mục MySQL

Về MySQL, bạn có thể đã nghe nói về việc nó có nhiều loại chỉ mục:

  • A B-Tree INDEX - một chỉ mục như vậy thường được sử dụng để tăng tốc các truy vấn SELECT khớp với mệnh đề WHERE. Chỉ mục như vậy có thể được sử dụng trên các trường mà giá trị không cần phải là duy nhất, nó cũng chấp nhận giá trị NULL.

  • MỘT CHỈ SỐ FULLTEXT - một chỉ mục như vậy được sử dụng để sử dụng khả năng tìm kiếm toàn văn. Loại chỉ mục này tìm các từ khóa trong văn bản thay vì so sánh trực tiếp các giá trị với các giá trị trong chỉ mục.

  • CHỈ SỐ DUY NHẤT thường được sử dụng để xóa các giá trị trùng lặp khỏi bảng. Thực thi tính duy nhất của các giá trị hàng.

  • TỪ KHÓA CHÍNH cũng là một chỉ mục - nó thường được sử dụng cùng với các trường có thuộc tính AUTO_INCREMENT. Loại chỉ mục này không chấp nhận các giá trị NULL và sau khi được đặt, không thể thay đổi các giá trị trong cột có KHÓA CHÍNH.

  • CHỈ SỐ MÔ TẢ là một chỉ mục lưu trữ các hàng theo thứ tự giảm dần. Loại chỉ mục này đã được giới thiệu trong MySQL 8.0 - MySQL sẽ sử dụng loại chỉ mục này khi truy vấn yêu cầu thứ tự giảm dần.

Chọn Loại Dữ liệu Tối ưu cho Chỉ mục trong MySQL

Liên quan đến chỉ mục, cũng cần lưu ý rằng MySQL hỗ trợ nhiều kiểu dữ liệu và một số kiểu dữ liệu không thể được sử dụng cùng với một số loại chỉ mục (ví dụ:FULLTEXT chỉ mục chỉ có thể được sử dụng trên các cột dựa trên văn bản (CHAR, VARCHAR hoặc TEXT) - chúng không thể được sử dụng trên bất kỳ kiểu dữ liệu nào khác) vì vậy trước khi thực sự chọn chỉ mục cho thiết kế cơ sở dữ liệu của bạn, hãy quyết định kiểu dữ liệu bạn sẽ sử dụng. cột được đề cập (quyết định loại lớp dữ liệu bạn sẽ lưu trữ:bạn sẽ lưu trữ số? Giá trị chuỗi? Cả số và giá trị chuỗi? v.v.), sau đó quyết định phạm vi giá trị bạn sẽ lưu trữ (chọn kiểu mà bạn không nghĩ là mình sẽ vượt quá vì việc tăng phạm vi kiểu dữ liệu có thể là một công việc tốn thời gian sau này - chúng tôi khuyên bạn nên chọn sử dụng kiểu dữ liệu đơn giản) và nếu bạn không có ý định sử dụng NULL các giá trị trong các cột của bạn, hãy chỉ định các trường của bạn là KHÔNG ĐỦ bất cứ khi nào bạn có thể - khi giá trị nullable co cột được lập chỉ mục, nó yêu cầu thêm một byte cho mỗi mục nhập.

Chọn Bộ ký tự và đối chiếu tối ưu cho các chỉ mục trong MySQL

Ngoài kiểu dữ liệu, cũng nên nhớ rằng mỗi ký tự trong MySQL đều chiếm dung lượng. Ví dụ:các ký tự UTF-8 có thể mất từ ​​1 đến 4 byte mỗi ký tự, vì vậy bạn có thể muốn tránh lập chỉ mục, ví dụ:255 ký tự và chỉ sử dụng, giả sử, 50 hoặc 100 ký tự cho một cột nhất định.

Lợi ích và hạn chế của việc sử dụng chỉ mục trong MySQL

Lợi ích chính của việc sử dụng các chỉ mục trong MySQL là tăng hiệu suất của các truy vấn tìm kiếm khớp với mệnh đề WHERE - các chỉ mục tăng tốc độ truy vấn SELECT khớp với mệnh đề WHERE vì MySQL không đọc qua toàn bộ bảng để tìm các hàng có liên quan đến truy vấn. Tuy nhiên, hãy nhớ rằng các chỉ số có những hạn chế riêng của chúng. Những điều chính như sau:

  • Chỉ mục tiêu tốn dung lượng đĩa.

  • Chỉ mục làm giảm hiệu suất của các truy vấn CHÈN, CẬP NHẬT và XÓA - khi dữ liệu được cập nhật, chỉ mục cần phải được được cập nhật cùng với nó.

  • MySQL không bảo vệ bạn khỏi việc sử dụng nhiều loại chỉ mục cùng một lúc. Nói cách khác, bạn có thể sử dụng TỪ KHÓA CHÍNH, MỘT CHỈ SỐ và CHỈ SỐ DUY NHẤT trên cùng một cột - MySQL không bảo vệ bạn khỏi việc làm như vậy.

Nếu bạn nghi ngờ rằng một số truy vấn của mình đang trở nên chậm hơn, hãy xem xét tab Giám sát truy vấn của ClusterControl - bằng cách bật trình theo dõi truy vấn, bạn có thể biết khi nào một truy vấn nhất định được nhìn thấy lần cuối và mức tối đa của nó và thời gian thực thi trung bình có thể giúp bạn chọn các chỉ mục tốt nhất cho bảng của mình.

Làm thế nào để Chọn Chỉ mục Tốt nhất để Sử dụng?

Để chọn chỉ mục tốt nhất để sử dụng, bạn có thể sử dụng cơ chế tích hợp sẵn của MySQL. Ví dụ, bạn có thể sử dụng trình giải thích truy vấn - truy vấn GIẢI THÍCH. Nó sẽ giải thích bảng nào được sử dụng, nếu nó có phân vùng hay không, những chỉ mục nào có thể sử dụng và khóa (chỉ mục) nào được sử dụng. Nó cũng sẽ trả về độ dài chỉ mục và số lượng hàng mà truy vấn của bạn trả về:

mysql> EXPLAIN SELECT * FROM demo_table WHERE demo_field = ‘demo’\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: demo_table
   partitions: NULL
         type: ref
possible_keys: demo_field
          key: demo_field
      key_len: 1022
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

Trong trường hợp này, hãy nhớ rằng các chỉ mục thường được sử dụng để giúp MySQL truy xuất dữ liệu hiệu quả khi tập dữ liệu lớn hơn bình thường. Nếu bảng của bạn nhỏ, bạn có thể không cần sử dụng chỉ mục, nhưng nếu bạn thấy các bảng của mình ngày càng lớn hơn, rất có thể bạn có thể được hưởng lợi từ chỉ mục.

Tuy nhiên, để chọn chỉ mục tốt nhất để sử dụng cho tình huống cụ thể của bạn, hãy nhớ rằng chỉ mục cũng có thể là nguyên nhân hàng đầu gây ra các vấn đề về hiệu suất. Hãy nhớ rằng MySQL có sử dụng hiệu quả các chỉ mục hay không phụ thuộc vào một số yếu tố bao gồm thiết kế truy vấn của bạn, chỉ mục đang sử dụng, loại chỉ mục được sử dụng, cũng như tải cơ sở dữ liệu của bạn tại thời điểm truy vấn được thực thi và những thứ khác. Dưới đây là một số điều cần xem xét khi sử dụng chỉ mục trong MySQL:

  • Bạn có bao nhiêu dữ liệu? Có lẽ một số trong số đó là thừa?

  • Bạn sử dụng truy vấn nào? Các truy vấn của bạn có sử dụng mệnh đề LIKE không? Còn đặt hàng thì sao?

  • Bạn cần sử dụng loại chỉ mục nào để cải thiện hiệu suất các truy vấn của mình?

  • Các chỉ mục của bạn lớn hay nhỏ? Bạn có cần sử dụng chỉ mục trên tiền tố của cột để làm cho kích thước của nó nhỏ hơn không?

Cần lưu ý rằng bạn có thể nên tránh sử dụng nhiều loại chỉ mục (ví dụ:chỉ mục B-Tree, chỉ mục DUY NHẤT và TỪ KHÓA CHÍNH) trên cùng một cột.

Cải thiện Hiệu suất Truy vấn với Chỉ mục

Để cải thiện hiệu suất truy vấn với các chỉ mục, bạn cần xem xét các truy vấn của mình - câu lệnh EXPLAIN có thể giúp bạn điều đó. Nói chung, đây là một số điều bạn nên xem xét nếu bạn muốn các chỉ mục của mình cải thiện hiệu suất của các truy vấn của bạn:

  • Chỉ yêu cầu cơ sở dữ liệu cho những gì bạn cần. Trong hầu hết các trường hợp, sử dụng cột CHỌN sẽ nhanh hơn sử dụng CHỌN * (đó là trường hợp không sử dụng các chỉ mục)

  • Chỉ mục B-tree có thể phù hợp nếu bạn tìm kiếm các giá trị chính xác (ví dụ:CHỌN * TỪ demo_table WHERE some_field ='x') hoặc nếu bạn muốn tìm kiếm các giá trị bằng ký tự đại diện (ví dụ:CHỌN * TỪ demo_table WHERE some_field LIKE 'demo%' - trong trường hợp này, hãy nhớ rằng sử dụng truy vấn LIKE với bất kỳ thứ gì ở đầu nó có thể làm được hại nhiều hơn lợi - tránh sử dụng các truy vấn LIKE có dấu phần trăm phía trước văn bản bạn đang tìm kiếm - theo cách đó MySQL có thể không sử dụng chỉ mục vì nó không biết giá trị hàng bắt đầu bằng gì) - mặc dù vậy hãy lưu ý rằng chỉ mục B-tree cũng có thể được sử dụng để so sánh cột trong các biểu thức sử dụng giá trị bằng (=), hơn (>), lớn hơn hoặc bằng (> =), nhỏ hơn (<), nhỏ hơn hoặc bằng (<=) hoặc GIỮA các toán tử.

  • Chỉ mục FULLTEXT có thể phù hợp nếu bạn thấy mình đang sử dụng toàn văn (TRẬN ... LẠI ( )) truy vấn tìm kiếm hoặc nếu cơ sở dữ liệu của bạn được thiết kế theo cách chỉ sử dụng các cột dựa trên văn bản - các chỉ mục FULLTEXT có thể sử dụng các cột TEXT, CHAR hoặc VARCHAR, chúng không thể được sử dụng trên bất kỳ loại cột nào khác.

  • Chỉ mục bao trùm có thể được sử dụng nếu bạn muốn chạy các truy vấn mà không cần đọc I / O bổ sung trên các bảng lớn . Để tạo chỉ mục bao hàm, hãy bao gồm các mệnh đề WHERE, GROUP BY và SELECT được truy vấn sử dụng.

Chúng ta sẽ xem xét kỹ hơn các loại chỉ mục trong các phần sắp tới của loạt bài blog này, nhưng nói chung, nếu bạn sử dụng các truy vấn như SELECT * FROM demo_table WHERE some_field ='x' a B-tree INDEX có thể phù hợp, nếu bạn sử dụng truy vấn MATCH () AGAINST (), bạn có thể nên xem chỉ mục FULLTEXT, nếu bảng của bạn có các giá trị hàng rất dài, bạn có thể nên xem xét lập chỉ mục một phần của cột.

Bạn nên có bao nhiêu chỉ mục?

Nếu bạn đã từng sử dụng các chỉ mục để cải thiện hiệu suất của các truy vấn CHỌN, có lẽ bạn đã tự hỏi mình một câu hỏi:bạn thực sự nên có bao nhiêu chỉ mục? Để hiểu được điều này, bạn cần ghi nhớ những điều sau:

  1. Chỉ mục thường hiệu quả nhất với lượng lớn dữ liệu.

  2. MySQL chỉ sử dụng một chỉ mục cho mỗi câu lệnh SELECT trong một truy vấn (các truy vấn con được coi là các câu lệnh riêng biệt) - sử dụng truy vấn GIẢI THÍCH để tìm ra chỉ mục nào hiệu quả nhất cho các truy vấn bạn sử dụng.

  3. Chỉ mục phải làm cho tất cả các câu lệnh SELECT của bạn đủ nhanh mà không ảnh hưởng quá nhiều đến dung lượng đĩa - “đủ nhanh” tuy nhiên, chỉ là tương đối nên bạn cần thử nghiệm.

Chỉ mục và Công cụ lưu trữ

Khi xử lý các chỉ mục trong MySQL, cũng nên nhớ rằng có thể có một số loại hạn chế nếu bạn sử dụng các công cụ khác nhau (ví dụ:nếu bạn sử dụng MyISAM thay vì InnoDB). Chúng tôi sẽ đi vào chi tiết hơn trong một blog riêng biệt, nhưng đây là một số ý tưởng:

  • 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 trên 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 - độ dài khóa tối đa cho MyISAM là 1000 byte.

  • Chỉ mục văn bản đầy đủ có giới hạn trong một số công cụ lưu trữ - ví dụ:chỉ mục văn bản đầy đủ của InnoDB có 36 từ dừng, MyISAM danh sách từ dừng lớn hơn một chút với 143 từ dừng. InnoDB lấy các từ dừng này từ biến innodb_ft_server_stopword_table trong khi MyISAM lấy các từ dừng này từ tệp lưu trữ / myisam / ft_static.c - tất cả các từ được tìm thấy trong tệp sẽ được coi là từ dừng.

  • MyISAM là công cụ lưu trữ duy nhất hỗ trợ các tùy chọn tìm kiếm toàn văn bản cho đến MySQL 5.6 (MySQL 5.6. Chính xác là 4) có nghĩa là InnoDB hỗ trợ các chỉ mục toàn văn kể từ MySQL 5.6.4. Khi chỉ mục FULLTEXT được sử dụng, nó sẽ tìm các từ khóa trong văn bản thay vì so sánh các giá trị trực tiếp với các giá trị trong chỉ mục.

  • Chỉ mục đóng một vai trò rất quan trọng đối với InnoDB - InnoDB khóa các hàng khi nó truy cập vào chúng, do đó, giảm số lượng hàng Truy cập InnoDB có thể giảm khóa.

  • MySQL cho phép bạn sử dụng các chỉ mục trùng lặp trên cùng một cột.

  • Một số công cụ lưu trữ nhất định có một số loại chỉ mục mặc định (ví dụ:đối với công cụ lưu trữ MEMORY, loại chỉ mục mặc định là băm )

Tóm tắt

Trong phần này về chỉ mục trong MySQL, chúng ta đã đi qua một số điều tổng quát liên quan đến chỉ mục trong hệ quản trị cơ sở dữ liệu quan hệ này. Trong các bài đăng blog sắp tới, chúng tôi sẽ đi qua một số kịch bản chuyên sâu hơn về việc sử dụng chỉ mục trong MySQL bao gồm việc sử dụng chỉ mục trong một số công cụ lưu trữ nhất định, v.v. - chúng tôi cũng sẽ giải thích cách ClusterControl có thể được sử dụng để đạt được mục tiêu hiệu suất của bạn trong MySQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển từ Oracle DB sang MariaDB

  2. Mã hóa MariaDB đầy đủ lúc nghỉ và đang chuyển để bảo vệ dữ liệu tối đa - Phần thứ hai

  3. 2 cách để biết ngày nào thuộc về quý trong MariaDB

  4. MariaDB FOUND_ROWS () Giải thích

  5. MariaDB Server 10.0.33 hiện có sẵn