Nếu bạn đã tìm thấy chính mình trong thế giới MySQL [ít nhất là trong một thời gian ngắn], rất có thể bạn đã nghe nói về việc sử dụng EXPLAIN. Trong thế giới MySQL, từ khóa này ở khắp mọi nơi
một năm trước • 5 phút đọc
Mục lục
Bạn đã bao giờ tìm kiếm lời khuyên về hiệu suất truy vấn chưa? . Bạn muốn biết những truy vấn của bạn làm gì ở cấp độ sâu hơn? . Bạn muốn biết truy vấn của mình sử dụng chỉ mục nào? . Sau khi đọc bài đăng trên blog này, bạn sẽ hiểu tầm quan trọng của từ khóa này [nếu bạn chưa hiểu]
Cách sử dụng GIẢI THÍCH
Để sử dụng EXPLAIN
ở dạng đơn giản nhất, hãy thêm từ khóa vào đầu truy vấn của bạn như vậy
EXPLAIN SELECT * FROM demo_table WHERE demo_column = 'Demo Value';
Một truy vấn như trên sẽ tạo ra kết quả tương tự như sau
********************* 1. row **********************
id: 1
select_type: SIMPLE
table: demo_table
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 1
filtered: 100.00
Extra: NULL
Như bạn có thể thấy, EXPLAIN
cung cấp cho bạn khá nhiều dữ liệu, bao gồm ID của truy vấn và loại truy vấn SELECT
mà bạn vừa chạy [ SIMPLE
đề cập đến thực tế là truy vấn không sử dụng các hoạt động JOIN
]. Bạn có thể xem bạn vừa chạy truy vấn trên bảng nào, phân vùng nào đã được sử dụng, loại truy vấn, các chỉ mục có thể đã được sử dụng và đã được sử dụng, độ dài của các chỉ mục, số lượng hàng và liệu có bất kỳ tỷ lệ phần trăm nào của truy vấn hay không.
Đầu ra ở trên được lấy từ lệnh EXPLAIN
0—bạn có thể nối thêm EXPLAIN
1 nếu bạn muốn MySQL cung cấp cho bạn thêm một số thông tin. Thông tin mở rộng được cung cấp cho các câu lệnh SELECT
, EXPLAIN
3, EXPLAIN
4, EXPLAIN
5 và EXPLAIN
6 nếu bạn đang sử dụng MySQL 8. 0. 12 trở lên và chỉ dành cho các truy vấn SELECT
trong các phiên bản cũ hơn của MySQL hoặc MariaDB. Lệnh EXPLAIN
1 có thể được sử dụng để có thêm thông tin về cách MySQL thực hiện truy vấn. nó có thể được sử dụng để xác định, ví dụ, chức năng nào được MySQL sử dụng để so sánh các cột với chỉ mục để chọn các hàng từ bảng, v.v.
GIẢI THÍCH là gì?
Trong thế giới MySQL, EXPLAIN
là một từ khóa được sử dụng để lấy thông tin về việc thực hiện truy vấn. Nói cách khác, từ khóa này cung cấp thông tin về cách cơ sở dữ liệu thực hiện một truy vấn nhất định – thêm ____1_______ trước truy vấn mà bạn chạy và bạn sẽ có thể quan sát
- ID của truy vấn
- Loại
SELECT
của bạn [nếu bạn đang chạy một chiếcSELECT
] - Bảng mà truy vấn của bạn đang chạy trên đó
- Các phân vùng được truy cập bởi truy vấn của bạn
- Các loại
JOIN
được sử dụng [nếu có] - Các chỉ mục mà MySQL có thể chọn
- Chỉ mục MySQL thực sự được sử dụng
- Độ dài của chỉ mục được chọn bởi MySQL
- Số hàng được truy cập bởi truy vấn
- Các cột so với chỉ mục
- Phần trăm số hàng được lọc theo một điều kiện cụ thể
- Mọi thông tin bổ sung liên quan đến truy vấn
Không còn nghi ngờ gì nữa, EXPLAIN
cung cấp rất nhiều thông tin. Tuy nhiên, khi bạn nắm được các tính năng của nó và hiểu cách sử dụng nó tốt nhất để đạt được các mục tiêu về hiệu suất của mình, thì việc sử dụng nó sẽ trở nên dễ dàng hơn
KHI NÀO SỬ DỤNG GIẢI THÍCH
Đến bây giờ, bạn nên biết về sức mạnh của các truy vấn EXPLAIN
trong MySQL. Tuy nhiên, chúng tôi vẫn chưa đề cập đến thời điểm bạn nên sử dụng các truy vấn như vậy ngay từ đầu. Trong không gian MySQL, mọi thứ khá đơn giản. Các truy vấn EXPLAIN
có thể [và nên] được sử dụng khi bạn không chắc liệu truy vấn của mình có thực hiện đúng chức năng của nó hay không. Vì vậy, ví dụ, nếu bạn nghĩ rằng bạn đã lập chỉ mục và phân vùng các bảng của mình đúng cách, nhưng các truy vấn của bạn vẫn từ chối chạy nhanh như bạn muốn, thì có lẽ đã đến lúc bạn nên yêu cầu họ tự EXPLAIN
. Hiểu rồi?
Sau khi bạn tự nói với các truy vấn của mình với EXPLAIN
, đầu ra mà bạn nên theo dõi sẽ phụ thuộc vào những gì bạn muốn tối ưu hóa, chẳng hạn như
Chỉ mục toàn văn + Tham gia
Nếu bạn muốn đảm bảo rằng các truy vấn của mình đang tham gia vào hoạt động JOIN
khi sử dụng chỉ mục EXPLAIN
0, hãy để ý đến cột EXPLAIN
1 - giá trị của cột này phải là EXPLAIN
2
phân vùng
Nếu bạn đã thêm phân vùng vào bảng của mình và muốn quan sát truy vấn nào sử dụng phân vùng nào, hãy quan sát cột EXPLAIN
3. Nếu phiên bản MySQL của bạn đang sử dụng phân vùng, thì trong hầu hết các trường hợp, MySQL sẽ tự xử lý tất cả các truy vấn và bạn không phải thực hiện thêm bất kỳ hành động nào, nhưng nếu bạn muốn truy vấn của mình sử dụng các phân vùng cụ thể, bạn có thể sử dụng các truy vấn như EXPLAIN
4. một truy vấn như vậy sẽ trả về tất cả các hàng từ các phân vùng EXPLAIN
5 và EXPLAIN
6 trong khi loại trừ các hàng từ tất cả các phân vùng khác
Phím, phím có thể và độ dài phím
Khi làm việc với các chỉ mục trong MySQL, hãy để ý đến các cột EXPLAIN
7, EXPLAIN
8 và EXPLAIN
9. Cột EXPLAIN
7 sẽ cho chúng tôi biết MySQL có thể sử dụng chỉ mục nào, cột EXPLAIN
8 sẽ cho chúng tôi biết chỉ mục nào đã được chọn và cột EXPLAIN
9 sẽ cho chúng tôi biết độ dài của khóa [chỉ mục] đã chọn. Tính năng này có thể hữu ích cho việc thiết kế chỉ mục của chúng tôi, quyết định sử dụng chỉ mục nào cho khối lượng công việc cụ thể, xử lý các vấn đề liên quan đến chỉ mục [ví dụ: chọn độ dài thích hợp cho chỉ mục bao phủ] và các trục trặc khác liên quan đến chỉ mục
Kiểu dữ liệu cột
Khi thiết kế các truy vấn, hãy chú ý đến cột EXPLAIN
3. Cột EXPLAIN
3 có thể được gọi là một trong những trường tốt nhất trong đầu ra khi có liên quan đến thiết kế truy vấn của bạn – lý do chính là nó hiển thị cách MySQL hoặc MariaDB tham gia các bảng
Giá trị
Nghĩa
systemBảng trống hoặc có một hàngconstGiá trị của cột có thể được coi là hằng số [có một hàng phù hợp với truy vấn]eq_refChỉ mục được nhóm lại và đang được sử dụng bởi thao tác [hoặc chỉ mục làEXPLAIN
5 hoặc EXPLAIN
6 với tất cả . Có lẽ kết quả tồi tệ nhất nếu bạn đang tối ưu hóa hiệu suất truy vấn trong MySQL hoặc MariaDBCác cột được so sánh với một chỉ mục
Cột giới thiệu cũng rất quan trọng, đặc biệt nếu bạn muốn cải thiện hiệu suất truy vấn của mình bằng cách sử dụng các chỉ mục – cột này hiển thị các cột được so sánh với chỉ mục để hoàn thành một yêu cầu nhất định. giá trị của const có nghĩa là một hằng số, trong khi giá trị của func có nghĩa là giá trị được sử dụng được lấy từ một hàm
Số hàng được truy cập
Khi thiết kế các chỉ mục bên trong các phiên bản cơ sở dữ liệu của bạn, hãy chú ý đến cột EXPLAIN
9. Cột này hiển thị số lượng hàng mà MySQL đã truy cập để hoàn thành một yêu cầu nhất định, điều này có thể rất hữu ích khi thiết kế các chỉ mục. Truy vấn của bạn có thể truy cập càng ít hàng thì truy vấn của bạn càng nhanh
Hàng được lọc
Lọc cũng có thể là một cái gì đó đáng để theo dõi. Cột này cho biết tỷ lệ phần trăm gần đúng của các hàng trong bảng đang được lọc theo một điều kiện cụ thể
Cột bổ sung
Để mắt đến cột EXPLAIN SELECT * FROM demo_table WHERE demo_column = 'Demo Value';
0 có thể không phải lúc nào cũng cần thiết, nhưng bạn nên nhớ rằng cột này có thể có nhiều giá trị, bao gồm
EXPLAIN SELECT * FROM demo_table WHERE demo_column = 'Demo Value';
1MySQL sử dụng chỉ mục giảm dần để hoàn thành truy vấnEXPLAIN SELECT * FROM demo_table WHERE demo_column = 'Demo Value';
2Bảng được truy vấn trốngEXPLAIN SELECT * FROM demo_table WHERE demo_column = 'Demo Value';
3MySQL đang rà soát cơ sở dữ liệu để tìm bất kỳ giá trị riêng biệt nào có thể xuất hiện trong cộtEXPLAIN SELECT * FROM demo_table WHERE demo_column = 'Demo Value';
4Truy vấn không có mệnh đề EXPLAIN SELECT * FROM demo_table WHERE demo_column = 'Demo Value';
5_______5_______6MySQL có thể sử dụng một chỉ mục nhất định để tối ưu hóa hoạt động của EXPLAIN SELECT * FROM demo_table WHERE demo_column = 'Demo Value';
7EXPLAIN
có thể được sử dụng trong một số tình huống khác nhau, nhưng như bây giờ bạn có thể biết, nó hữu ích nhất khi tối ưu hóa hiệu suất của truy vấn hoặc đánh giá kết quả tối ưu hóa truy vấn
Tóm lược
Câu lệnh EXPLAIN
trong MySQL có thể được sử dụng để lấy thông tin về việc thực hiện truy vấn. Đó là thuận lợi khi thiết kế lược đồ hoặc chỉ mục và để đảm bảo rằng cơ sở dữ liệu của chúng tôi có thể sử dụng các tính năng do MySQL cung cấp ở mức độ lớn nhất có thể. Tuy nhiên, hãy nhớ rằng câu lệnh EXPLAIN
không phải là người bạn duy nhất của bạn về vấn đề này - nếu bạn muốn tối ưu hóa hiệu suất của các phiên bản MySQL của mình, các ứng dụng khách SQL như Arctype cũng có thể hỗ trợ rất nhiều—hãy cung cấp cho nó các truy vấn của bạn và nó sẽ làm nên điều kỳ diệu