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

Tại sao LEFT JOIN chậm hơn INNER JOIN?

Với INNER JOIN, MySQL nói chung sẽ bắt đầu với bảng có số hàng nhỏ nhất. Trong trường hợp này, nó bắt đầu bằng bảng finished và tìm kiếm bản ghi tương ứng trong saved bằng cách sử dụng chỉ mục trên saved.email .

Đối với THAM GIA TRÁI, (không bao gồm một số tối ưu hóa) MySQL thường kết hợp các bản ghi theo thứ tự (bắt đầu với bảng ngoài cùng bên trái). Trong trường hợp này, MySQL bắt đầu với bảng saved , sau đó cố gắng tìm từng bản ghi tương ứng trong finished . Vì không có có thể sử dụng được lập chỉ mục trên finished.email , nó phải quét toàn bộ cho mỗi lần tra cứu.

Chỉnh sửa

Bây giờ bạn đã đăng lược đồ của mình, tôi có thể thấy rằng MySQL đang bỏ qua chỉ mục (finished.email ) khi đi từ utf8 thành latin1 bộ ký tự. Bạn chưa đăng bộ ký tự và đối chiếu cho mỗi cột, vì vậy tôi sẽ theo bộ ký tự mặc định cho bảng. Các đối chiếu phải tương thích để MySQL sử dụng chỉ mục.

MySQL có thể ép buộc (nâng cấp) một latin1 đối chiếu, rất hạn chế, tối đa utf8 đối chiếu chẳng hạn như unicode_ci (vì vậy truy vấn đầu tiên có thể sử dụng chỉ mục trên saved.email bằng cách nâng cấp latin1 đối chiếu với utf8 ), nhưng điều ngược lại là không đúng (truy vấn thứ hai không thể sử dụng chỉ mục trên finished.email vì nó không thể hạ cấp utf8 đối chiếu xuống latin1 ).

Giải pháp là thay đổi cả hai cột email thành đối chiếu tương thích, có lẽ dễ dàng nhất bằng cách biến chúng thành các bộ ký tự và đối chiếu giống hệt nhau.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Máy chủ WAMP màu xanh lục nhưng chỉ nhận được 404

  2. PHP, MySQL, PDO - Nhận kết quả từ truy vấn CẬP NHẬT?

  3. ResultSet -> getString () bị treo khi giá trị> =16

  4. Laravel:Dữ liệu chuỗi, bị cắt ngắn bên phải:1406 Dữ liệu quá dài cho cột

  5. Xóa khỏi một bảng có tham gia