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

MySQL với JOIN không sử dụng chỉ mục

Tôi không biết sự khác biệt mà bạn đang thấy trong các bản cài đặt trước đây và hiện tại của mình nhưng hoạt động của máy chủ có ý nghĩa.

SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id )  ORDER BY  test_events.create_time DESC LIMIT 1; 

Trong truy vấn này, bạn không có mệnh đề where nhưng bạn chỉ tìm nạp một hàng. Và đó là sau khi sắp xếp theo create_time mà tình cờ có một chỉ mục. Và chỉ mục đó có thể được sử dụng để sắp xếp. Nhưng hãy xem truy vấn thứ hai.

SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id ) WHERE base = 314 ORDER BY  test_events.create_time DESC LIMIT 1

Bạn không có chỉ mục trên cột cơ sở. Vì vậy, không có chỉ mục nào có thể được sử dụng trên đó. Để tìm các bản ghi liên quan, mysql phải thực hiện quét bảng. Sau khi xác định các hàng xuống cấp, chúng cần được sắp xếp. Nhưng trong trường hợp này, người lập kế hoạch truy vấn đã quyết định rằng không đáng để sử dụng chỉ mục trên create_time

Tôi thấy một số vấn đề với thiết lập của bạn, lỗi đầu tiên là không có và lập chỉ mục trên base như đã được đề cập. Nhưng tại sao lại là varchar cơ sở? Có vẻ như bạn đang lưu trữ các số nguyên trong đó.

ALTER TABLE test_events
  ADD PRIMARY KEY (id),
  ADD KEY client (client),
  ADD KEY event_time (event_time),
  ADD KEY manager (manager),
  ADD KEY base_id (base_id),
  ADD KEY create_time (create_time);

Và việc tạo nhiều chỉ mục như thế này không có nhiều ý nghĩa trong mysql. Đó là bởi vì mysql chỉ có thể sử dụng một chỉ mục trên mỗi bảng cho các truy vấn. Bạn sẽ tốt hơn nhiều với một hoặc hai chỉ mục. Có thể có nhiều chỉ mục cột.

Tôi nghĩ chỉ mục lý tưởng của bạn sẽ chứa cả trường create_time và sự kiện



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. node-mysql nhiều câu lệnh trong một truy vấn

  2. Cách sao chép cơ sở dữ liệu MySQL sang máy chủ khác

  3. Làm cách nào để chọn nhiều giá trị trong cùng một cột?

  4. Cách ghi dữ liệu trên trang tính mới của EXCEL

  5. Làm cách nào để chèn dữ liệu vào cơ sở dữ liệu MySQL?