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