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

MySQL GIẢI THÍCH 'type' thay đổi từ 'range' thành 'ref' khi ngày tháng trong câu lệnh where bị thay đổi?

Các chiến lược tìm kiếm khác nhau có ý nghĩa đối với các dữ liệu khác nhau. Đặc biệt, quét chỉ mục (chẳng hạn như phạm vi) thường phải thực hiện tìm kiếm để thực sự đọc hàng. Tại một số điểm, thực hiện tất cả các tìm kiếm đó còn chậm hơn so với việc không sử dụng chỉ mục.

Lấy một ví dụ thông thường, một bảng có ba cột:id (khóa chính), tên (được lập chỉ mục), ngày sinh. Nói rằng nó có rất nhiều dữ liệu. Nếu bạn yêu cầu MySQL tìm kiếm ngày sinh của Bob, nó có thể làm điều đó khá nhanh chóng:đầu tiên, nó tìm thấy Bob trong chỉ mục tên (điều này mất một vài lần tìm kiếm, log (n) trong đó n là số hàng), sau đó thêm một lần tìm kiếm đọc hàng thực tế trong tệp dữ liệu và đọc ngày sinh từ hàng đó. Điều đó rất nhanh và nhanh hơn nhiều so với việc quét toàn bộ bảng.

Tiếp theo, hãy cân nhắc đặt tên name like 'Z%' . Đó có lẽ là một phần khá nhỏ của bảng. Vì vậy, vẫn nhanh hơn để tìm vị trí các chữ Z bắt đầu trong chỉ mục tên, sau đó tìm kiếm tệp dữ liệu để đọc hàng. (Đây là cách quét phạm vi).

Cuối cùng, hãy xem xét yêu cầu tất cả các tên bắt đầu bằng M-Z. Đó có lẽ là khoảng một nửa dữ liệu. Nó có thể quét theo phạm vi và sau đó là nhiều tìm kiếm, nhưng tìm kiếm ngẫu nhiên trên tệp dữ liệu với mục tiêu cuối cùng là đọc một nửa số hàng không phải là tối ưu:sẽ nhanh hơn nếu chỉ đọc một tuần tự lớn trên tệp dữ liệu. Vì vậy, trong trường hợp này, chỉ mục sẽ bị bỏ qua.

Đây là những gì bạn đang thấy — ngoại trừ trong trường hợp của bạn, có một chìa khóa khác mà nó có thể rơi trở lại. (Cũng có thể là nó thực sự có thể sử dụng chỉ mục ngày nếu nó không có chỉ mục kia, nó nên chọn chỉ mục nào sẽ nhanh nhất. Hãy lưu ý rằng trình tối ưu hóa của MySQL thường mắc lỗi trong điều này.)

Vì vậy, trong ngắn hạn, điều này được mong đợi. Một truy vấn không cho biết như thế nào để truy xuất dữ liệu, đúng hơn nó nói cái gì dữ liệu cần truy xuất. Trình tối ưu hóa cơ sở dữ liệu phải tìm cách nhanh nhất để truy xuất nó.

Bạn có thể tìm thấy một chỉ mục trên cả hai các cột, theo thứ tự (public_key, create_on_date) được ưu tiên trong cả hai trường hợp và tăng tốc truy vấn của bạn. Điều này là do MySQL chỉ có thể sử dụng một chỉ mục cho mỗi bảng (mỗi truy vấn). Ngoài ra, ngày sẽ kết thúc bởi vì quá trình quét phạm vi chỉ có thể được thực hiện hiệu quả trên cột cuối cùng trong chỉ mục.

[InnoDB thực sự có một lớp hướng dẫn khác, tôi tin rằng, nhưng nó chỉ làm nhầm lẫn vấn đề. Nó không tạo ra sự khác biệt cho lời giải thích.]




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị tất cả các hàng trong bảng mysql sau đó cung cấp tùy chọn để xóa những hàng cụ thể

  2. Bảng [tên bảng] không bị khóa

  3. Làm thế nào để lấy khóa chính của bảng?

  4. Cách thực hiện tham gia toàn bộ bên ngoài trong MySQL

  5. CHỌN id CÓ số lượng tối đa của id