Câu trả lời cho câu hỏi này phụ thuộc vào việc bạn đang sử dụng mysql trước 5.7 hay 5.7 và sau đó. Tôi có thể sửa đổi câu hỏi của bạn một chút, nhưng hy vọng những điều sau đây nắm bắt được ý kiến của bạn.
SELECT * FROM Table
của bạn thực hiện quét bảng thông qua chỉ mục được phân cụm (thứ tự vật lý). Trong trường hợp không có khóa chính, một khóa là ngầm định
có sẵn cho động cơ. Không có mệnh đề where như bạn nói. Không có thử lọc hoặc lựa chọn chỉ mục nào khác.
Giải thích
đầu ra (xem cả
) hiển thị 1 hàng trong phần tóm tắt của nó. Nó tương đối thẳng về phía trước. Giải thích kết quả đầu ra và hiệu suất với bảng dẫn xuất của bạn B
sẽ khác nhau tùy thuộc vào việc bạn đang sử dụng phiên bản trước 5.7 hay 5.7 trở về sau.
Tài liệu Bảng có nguồn gốc trong MySQL 5.7 mô tả nó tốt cho các phiên bản 5.6 và 5.7, trong đó phiên bản thứ hai sẽ không cung cấp hình phạt do sự thay đổi trong đầu ra bảng dẫn xuất cụ thể hóa được kết hợp vào truy vấn bên ngoài. Trong các phiên bản trước, chi phí đáng kể đã phải chịu đựng với các bảng tạm thời có nguồn gốc.
Khá dễ dàng để kiểm tra hình phạt hiệu suất trước ngày 5.7. Tất cả những gì cần là một bảng có kích thước trung bình để xem tác động đáng chú ý mà bảng dẫn xuất của câu hỏi của bạn đối với việc ảnh hưởng đến hiệu suất. Ví dụ sau trên một bảng nhỏ trong phiên bản 5.6:
explain
select qm1.title
from questions_mysql qm1
join questions_mysql qm2
on qm2.qid<qm1.qid
where qm1.qid>3333 and qm1.status='O';
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
| 1 | SIMPLE | qm1 | range | PRIMARY,cactus1 | PRIMARY | 4 | NULL | 5441 | Using where |
| 1 | SIMPLE | qm2 | ALL | PRIMARY,cactus1 | NULL | NULL | NULL | 10882 | Range checked for each record (index map: 0x3) |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
explain
select b.title from
( select qid,title from questions_mysql where qid>3333 and status='O'
) b
join questions_mysql qm2
on qm2.qid<b.qid;
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
| 1 | PRIMARY | qm2 | index | PRIMARY,cactus1 | cactus1 | 10 | NULL | 10882 | Using index |
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 5441 | Using where; Using join buffer (Block Nested Loop) |
| 2 | DERIVED | questions_mysql | range | PRIMARY,cactus1 | PRIMARY | 4 | NULL | 5441 | Using where |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
Lưu ý, tôi đã thay đổi câu hỏi, nhưng nó minh họa tác động của các bảng dẫn xuất và việc chúng không được sử dụng chỉ mục với trình tối ưu hóa có trong các phiên bản trước 5.7. Bảng dẫn xuất được hưởng lợi từ các chỉ mục khi nó đang được hiện thực hóa. Nhưng sau đó, nó tồn tại trên đầu dưới dạng một bảng tạm thời và được kết hợp vào truy vấn bên ngoài mà không sử dụng chỉ mục. Đây không phải là trường hợp trong phiên bản 5.7