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

MySQL là chỉ mục của tôi có tốt không?

Viết truy vấn theo cách này:

SELECT *
    FROM orders
    JOIN users  ON orders.id_user = users.id
    WHERE orders.status='new'

Không chỉ định chỉ mục nào sẽ sử dụng.

Bắt đầu với WHERE mệnh đề này có dạng như thế này might hữu ích:INDEX(status) . Nhưng vì "trạng thái" nghe giống như một "cờ" có số lượng thấp, nên trình tối ưu hóa có thể quyết định bỏ qua chỉ mục và chỉ cần thực hiện quét bảng. Điều này không sao. Nó là OK vì quét bảng nhanh hơn so với việc trả lại giữa một chỉ mục và dữ liệu, khi chỉ mục không được chọn lọc nhiều. Trong mọi trường hợp, hãy để Trình tối ưu hóa quyết định.

Bây giờ nó đang xử lý orders , nó cần phải JOIN tới users . Cách duy nhất để làm điều đó là có một chỉ mục trên id . Tên đó ("id") ngụ ý rằng nó có thể là PRIMARY KEY , Là nó? (Vui lòng cung cấp SHOW CREATE TABLE .)

Chỉ mục sách nấu ăn

Truy vấn khác mà bạn đã đề cập nên được viết

SELECT * FROM users WHERE id=33

Và, như đã thảo luận, chỉ mục (PRIMARY KEY ?) trên id là điều đúng đắn.

Không có lợi thế (đối với SELECTs đã cho , ít nhất) cho INDEX(status, id_user) . Lựa chọn của bạn bao gồm tất cả các cột (* ); nó chỉ được tìm nạp id_user , thì một chỉ mục như vậy sẽ "bao trùm" và có một số lợi thế.




  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 - tổng (các) giá trị cột dựa trên hàng từ cùng một bảng

  2. Laravel SQLSTATE [23000]:Vi phạm ràng buộc toàn vẹn:1452 Không thể thêm hoặc cập nhật một hàng con

  3. Tìm nạp dữ liệu từ Mysql DB sang listView bằng JSON và PHP

  4. Gridview không tồn tại trong bối cảnh hiện tại

  5. CHÈN SQL ... CHỌN với DATETIME tăng tự động