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

Hình phạt hiệu suất cho các truy vấn mysql lồng nhau

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Vị trí của máy khách mysql .my.cnf trong XAMPP cho Windows là gì?

  2. Làm thế nào để phân trang trong khi UNION được sử dụng trong MySQL?

  3. Cảnh báo:mysqli_connect ():Máy chủ lưu trữ máy chủ MySQL không xác định

  4. Gửi dữ liệu từ javascript đến cơ sở dữ liệu mysql

  5. Khóa duy nhất nào được nhấn với phần chèn của tôi?