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

MySQL sử dụng chỉ mục khác nhau tùy thuộc vào giá trị giới hạn với truy vấn ORDER BY

Đó là cách mọi thứ diễn ra. Chờ tôi một phút ...

Trình tối ưu hóa muốn sử dụng INDEX, trong trường hợp này là ACTI_DATE_I. Nhưng nó không muốn sử dụng nếu điều đó sẽ chậm hơn.

Kế hoạch A:Sử dụng chỉ mục.

  1. Tiếp cận chỉ mục có cấu trúc BTree ở cuối (vì DESC)
  2. Quét ngược
  3. Đối với mỗi hàng trong chỉ mục, hãy tra cứu hàng tương ứng trong dữ liệu. Lưu ý:Chỉ mục có (ACTIVITY_DATE, ACTIVITY_ID) vì KHÓA CHÍNH được thêm vào bất kỳ khóa phụ nào. Để tiếp cận "dữ liệu" bằng PK (ACTIVITY_ID) là một cách tra cứu BTree khác, có thể là ngẫu nhiên. Do đó, nó có khả năng chậm. (Nhưng không chậm lắm trong trường hợp của bạn.)
  4. Điều này dừng lại sau LIMIT hàng.

Kế hoạch B:Bỏ qua bảng

  1. Quét bảng, tạo bảng tmp. (Có thể là trong bộ nhớ.)
  2. Sắp xếp bảng tmp
  3. Gỡ bỏ LIMIT hàng.

Trong trường hợp của bạn (96 - 1% của 10K), thật đáng ngạc nhiên là nó đã chọn quét bảng. Thông thường, giới hạn nằm ở khoảng 10% -30% số hàng trong bảng.

ANALYZE TABLE nên đã thực hiện tính toán lại thống kê, điều này có thể đã thuyết phục nó thực hiện với Kế hoạch khác.

Bạn đang sử dụng phiên bản MySQL nào? (Không, tôi không biết bất kỳ thay đổi nào trong lĩnh vực này.)

Một điều bạn có thể thử:OPTIMIZE TABLE ACTIVITIES; Điều đó sẽ xây dựng lại bảng, do đó đóng gói lại các khối và dẫn đến tiềm năng thống kê khác nhau. Nếu điều đó hữu ích, tôi muốn biết điều đó - vì tôi thường nói "Bảng tối ưu hóa là vô dụng".




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.lang.Incomp Tương thíchClassChangeError:Đã tìm thấy lớp com.mysql.jdbc.Statement, nhưng giao diện được mong đợi

  2. MySQL> Bảng không tồn tại. Nhưng nó có (hoặc nó phải)

  3. Tìm kiếm MySQL để bỏ qua dấu gạch nối

  4. Hoàn thành bài viết hôm nay nhưng ít nhất 20 phút trước

  5. Triển khai kiểu con siêu loại một cách chính xác trong MySQL