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

sự khác biệt mysql trong việc sử dụng chỉ mục giữa MyISAM và InnoDB

Trong InnoDB, bất kỳ chỉ mục phụ nào bên trong đều chứa cột khóa chính của bảng. Vì vậy, chỉ mục tên trên cột (tên) là ngầm định trên các cột (tên, id).

Điều này có nghĩa là EXPLAIN hiển thị quyền truy cập của bạn vào bảng danh mục dưới dạng "quét chỉ mục" (điều này được hiển thị trong loại cột là "chỉ mục"). Bằng cách quét chỉ mục, nó cũng có quyền truy cập vào cột id, cột này sử dụng để tìm kiếm các hàng trong bảng thứ hai, mục.

Sau đó, nó cũng tận dụng chỉ mục mục trên (category_id) thực sự là (category_id, id) và nó có thể tìm nạp item.id cho danh sách lựa chọn của bạn chỉ bằng cách đọc chỉ mục. Không cần phải đọc bảng (điều này được hiển thị trong Thêm là "Sử dụng chỉ mục").

MyISAM không lưu trữ các khóa chính với khóa phụ theo cách này, vì vậy nó không thể có được các tối ưu hóa tương tự. Quyền truy cập vào bảng danh mục là loại "TẤT CẢ" có nghĩa là quét bảng.

Tôi mong đợi quyền truy cập vào mục bảng MyISAM sẽ là "ref" khi nó tra cứu các hàng bằng cách sử dụng chỉ mục trên (category_id). Nhưng trình tối ưu hóa có thể nhận được kết quả sai lệch nếu bạn có rất ít hàng trong bảng hoặc nếu bạn chưa thực hiện ANALYZE TABLE item kể từ khi tạo chỉ mục.

Cập nhật lại:

Có vẻ như trình tối ưu hóa thích quét chỉ mục hơn quét bảng, vì vậy nó có cơ hội thực hiện quét chỉ mục trong InnoDB và đặt bảng danh mục trước. Trình tối ưu hóa quyết định sắp xếp lại các bảng thay vì sử dụng các bảng theo thứ tự bạn đã đưa ra trong truy vấn của mình.

Trong bảng MyISAM, sẽ có một bảng quét bất kỳ bảng nào nó chọn để truy cập đầu tiên, nhưng bằng cách đặt bảng danh mục thứ hai, nó tham gia vào chỉ mục chính CHÍNH của danh mục thay vì chỉ mục phụ của mục. Trình tối ưu hóa ưu tiên các tra cứu thành khóa duy nhất hoặc khóa chính (loại "eq_ref").




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xuất bảng mysql sang tệp .txt hoặc .doc bằng PHP

  2. lưu trữ dữ liệu trong bảng theo các ID tăng dần

  3. Đầu ra cơ sở dữ liệu PHP không hiển thị đúng cách

  4. Chèn Biểu mẫu HTML $ _POST Mảng vào MySQL bằng cách sử dụng Implode

  5. Kết nối từ xa với cơ sở dữ liệu MySQL