Bảng mặc định của mysql là gì năm 2024
Trước khi thực thi câu lệnh, MySQL sẽ thực hiện quá trình tối ưu hoá. MySQL sẽ thực hiện việc tính toán để đưa ra chi phí thực thi ước lượng (thời gian thực hiện) cho các phương án khác nhau có thể có. Bạn có thể xem thêm bài viết Sơ lược về kiến trúc của MySQL, để hiểu rõ hơn cách MySQL thực thi câu query. Show EXPLAIN là câu lệnh sẽ giúp chúng ta có được thông tin về các tính toán tối ưu này. Qua đó, chúng ta có thể đánh giá được câu lệnh có vấn đề gì không, có điểm nào cần cải thiện hay không? Bài viết này giúp bạn tìm hiểu về cách sử dụng MySQL EXPLAIN. Trong bài viết này tôi sử dụng MySQL Employees Sample Database để thực hiện các ví dụ minh hoạ. Sơ lược về EXPLAIN
Cú pháp sử dụngDưới đây là mô tả cú pháp sử dụng EXPLAIN và EXPLAIN ANALYZE:
Giải thích EXPLAIN output
Với định dạng mặc định TRADITIONAL, output của EXPLAIN là một table. Mỗi dòng output cung cấp thông tin về 1 table. Với câu query bên trên, kết quả sẽ cho hai dòng như sau: Dưới đây là ý nghĩa output EXPLAIN ở định dạng TRADITIONAL: select_type Ý nghĩa id SELECT identifier Trong trường hợp bạn sử dụng câu truy vấn lồng nhau thì các câu SELECT sẽ được đánh thứ tự để phân biệt. select_type Cột này chỉ ra dòng này là một SELECT phức tạp hay đơn giản. Nếu nhãn là SIMPLE có nghĩa đây là dạng truy vấn đơn giản, không sử dụng UNION hay SUBQUERIES. Nếu truy vấn có bất kỳ phần con phức tạp nào, phần ngoài cùng được gắn nhãn là PRIMARY và các phần khác có thể được gắn nhãn như sau:
type Đây là một thông tin rất quan trọng, mô tả cách access vào table trong câu query. Tuỳ vào cách access mà tốc độ truy vấn nhanh chậm khác nhau. Dựa vào type, chúng ta có thể điều chỉnh index cho database. Các loại type thường gặp gồm:
Extra Các thông tin thêm về cách mà MySQl giải quyết câu query. Những giá trị Extra thường gặp gồm:
Nhìn chung, mỗi dòng thông tin của EXPLAIN chứa khá nhiều thông tin. Để đánh giá nhanh câu query, nhận biết câu query có đang gặp vấn đề performance hay không, bạn có thể nhìn vào các field: select_type, type và Extra.
Giải thích EXPLAIN ANALYZE outputTừ MySQL 8.0.18, bên cạnh EXPLAIN, MySQL cung cấp thêm câu lệnh EXPLAIN ANALYZE. Về cơ bản thì cũng thực hiện câu lệnh EXPLAIN. Tuy nhiên, định dạng output khác so với EXPLAIN, nó hiển thị các thông tin output về thời gian thực thi và iterator. Với EXPLAIN ANALYZE, định dạng không được hỗ trợ phong phú như EXPLAIN. Nó chỉ chấp nhận định dạng TREE cho output. Để hiểu rõ hơn sự khác biệt của EXPLAIN ANALYZE và EXPLAIN, chúng ta sẽ cùng đi qua ví dụ bên dưới: Với EXPLAIN:
Output của EXPLAIN cho biết: Câu SELECT sử dụng index PRIMARY trên bảng
4 để tìm kiếm trong
5, ước lượng số dòng phải đọc là
6 dòng. Với InnoDB, đây là là con số ước lượng, không phải số thực tế khi thực thi. Khi chạy câu query, kết quả thực tế như sau:
Câu query mất
7 để đọc
8 dòng. Như bạn thấy đó, số dòng thực tế cần đọc khi thực thi khác nhiều so với con số mà EXPLAIN đưa ra. Với EXPLAIN ANALYZE:
Phân tích output của EXPLAIN ANALYZE:
9 - đây là bước đầu tiên thực hiện, chỉ ra rằng câu SELECT sử dụng index PRIMARY trên bảng employees để tìm kiếm trong range (
0)
1 - chỉ ra chi phí ước lượng và số dòng cần đọc (con số này giống với số dòng EXPLAIN đưa ra bên trên)
2 - đây là phần số liệu thực tế khi thực thi câu lệnh SELECT:
Như bạn thấy EXPLAIN ANALYZE hiển thị tất cả các thông tin chi tiết như trên cho từng bước: index scan, filter, aggregate. Điều đó thực sự hữu ích cho việc tối ưu hoá câu truy vấn. Tại bước cuối cùng:
7, thời gian thực tế cần thiết là
8. Report cuối cùng vì vậy mà hiển thị:
9. Như vậy, theo report thì câu query này cần
0 để thực thi. Tuy nhiên, với câu query này, chúng ta chạy ở bên trên, kết quả chạy thực tế cho thấy thời gian thực thi là
7. EXPLAIN ANALYZE thực hiện câu query, đo thời gian thực thi của từng bước, và xuất ra output. Chính vì thế so với câu query đơn thuần thì câu query chứa EXPLAIN ANALYZE sẽ có thời gian thực thi nhiều hơn. Định dạng output EXPLAIN ANALYZE so với EXPLAIN thì: ngắn gọn, cô đọng, dễ hình dung các bước thực hiện câu query hơn. Tuy nhiên cần lưu ý thời gian thực thi cuối cùng của report EXPLAIN ANALYZE bao gồm cả thời gian xử lý cho việc EXPLAIN. Sử dụng EXPLAIN để tối ưu một câu query chậmQua phần giải thích về output, các bạn đã hiểu được những thông tin từ EXPLAIN đưa ra. Trong phần này, chúng ta sẽ sử dụng những thông tin đó để tối ưu cho một câu query. Như đã đề cập ở phần mở đầu, tôi sử dụng MySQL Employees Sample Database để làm các ví dụ minh hoạ. Câu query chọn làm ví dụ là: Lấy ra thông tin
2,
3,
4,
5 của tất cả employees có
6 thời gian bắt đầu làm việc nằm trong khoảng thời gian
7 đến
8, và sắp xếp thứ tự kết quả theo
4:
Dưới đây là hình ảnh trích lược kết quả câu query: Report kết quả:
0 Bây giờ, sử dụng EXPLAIN để kiểm tra các thông tin về loại JOIN có vấn đề gì không nhé:
Dòng đầu tiên của output cho thấy:
1(loại JOIN tốn kém nhất),
2(không thể xác định được bất cứ khoá nào dùng cho JOIN),
3(sử dụng sắp xếp, bảng tạm đều tốn chi phí). Tất cả các thông tin này đều cho thấy câu query không tốt. Với trường hợp
1, chúng ta có thể tối ưu bằng cách thêm indexes để tránh việc quét toàn bộ bảng. Chúng ta nên bắt đầu đánh indexes những cột xuất hiện trong mệnh đề WHERE. Với câu query trên, tôi chọn thêm indexes trên cột
5
Kiểm tra lại bằng EXPLAIN để xem sự thay đổi:
Dòng đầu tiên của output cho thấy:
1(loại JOIN tốn kém nhất) đã thay đổi thành
7 vì sử dụng
8. Thay vì scan qua
9 thì giờ đây là:
0. Nhờ vậy mà số rows phải duyệt giảm đi đáng kể. Chúng ta chạy lại câu query trên một lần nữa để kiểm tra thời gian thực thi thực tế: Report kết quả:
1. So với khi chưa đánh indexes:
0. Thời gian thực thi nhanh hơn 10 lần. KếtBài viết này giải thích ý nghĩa output của EXPLAIN và EXPLAIN ANALYZE, cũng như cách chúng ta sử dụng chúng để tối ưu câu query. Một vài điểm tóm tắt từ nội dung bài viết:
Khi viết câu truy vấn dữ liệu, có rất nhiều cách viết câu query, đặc biệt là với dữ liệu lớn, nhiều bảng, nhiều liên kết. Hẳn là bạn sẽ có lúc phân vân không biết cách viết nào là tối ưu. Khi đó, câu lệnh EXPLAIN thực sự hữu ích. Chúng ta không cần cài đặt gì thêm, chỉ cần gọi trước câu truy vấn, bạn sẽ có ngay được kết quả so sánh. Tôi cũng khá thích format output của EXPLAIN ANALYZE, nó liệt kê ngắn gọn các bước thực hiện và thời gian thực thi. Hãy tận dụng linh hoạt EXPLAIN và EXPLAIN ANALYZE để hỗ trợ bạn tốt nhất trong lúc kiểm tra và tối ưu câu query nhé! |