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

Truy vấn MySQL không sử dụng chỉ mục trong tham gia bảng

Như bạn có thể thấy trong EXPLAIN, "book_id" được liệt kê là một khóa khả thi. Nếu MySQL không sử dụng nó, chỉ là trình tối ưu hóa không nghĩ rằng nó sẽ tăng tốc truy vấn. Điều này đúng nếu "book_sales" chỉ có 2 hàng và 100% các hàng đó có chung "book_id". Nó được gọi là cardinality btw. Cách tránh quét bảng (Hướng dẫn sử dụng MySQL)

Hãy thử lấp đầy nó với nhiều hàng hơn và bạn sẽ thấy rằng MySQL sẽ sử dụng một chỉ mục cho phép nối.

Chỉnh sửa:truy vấn

SELECT sale_amount, price
FROM books, book_sales
FORCE INDEX ( book_id ) 
WHERE book_sales.book_id = books.book_id
AND books.author_id =1

... cũng sẽ không hoạt động trong trường hợp đó vì trình tối ưu hóa vẫn nhận ra rằng việc đọc chỉ mục là dưới mức tối ưu và chuyển đổi thứ tự bảng để tránh làm như vậy. Bạn có thể buộc thứ tự bảng bằng cách sử dụng STRAIGHT_JOIN . Tuy nhiên, đây là một vấn đề hơi khó vì nó buộc MySQL phải thực thi truy vấn theo cách không phải là tốt nhất.

      EXPLAIN
       SELECT sale_amount, price
         FROM books
STRAIGHT_JOIN book_sales FORCE INDEX (book_id) ON book_sales.book_id = books.book_id
        WHERE books.author_id = 1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL - Chọn giá trị cụ thể từ một mảng được tìm nạp

  2. Đếm số lần xuất hiện của một chuỗi con trong một cột MySQL

  3. # 1222 - Các câu lệnh SELECT đã sử dụng có một số cột khác nhau

  4. Cơ sở dữ liệu MySQL sao lưu tự động trên máy chủ windows

  5. Làm cách nào để lưu trữ ngày-giờ trong UTC vào cơ sở dữ liệu bằng EclipseLink và Joda-Time?