Làm thế nào tôi có thể biết nếu một chỉ mục đang được sử dụng để sắp xếp trong MySQL?


10

Tôi có một truy vấn với mệnh đề ORDER BY sử dụng một cột là cột cuối cùng trên một chỉ mục đang được sử dụng trong mệnh đề WHERE, về cơ bản có dạng:

SELECT
  cols
FROM
  tables
WHERE
  col_1 = x
  AND col_2 = y
  AND col_3 = z
ORDER BY col_4

và chỉ mục được tạo trên các cột (col_1, col_2, col_3, col_4) theo thứ tự đó.

Khi tôi cấu hình truy vấn, hơn 99% thời gian được sử dụng ở trạng thái "Sắp xếp kết quả". col_4 là cột dấu thời gian nếu điều đó tạo ra sự khác biệt. Tôi hiểu rằng ORDER BY chỉ có thể sử dụng một chỉ mục trong một số trường hợp nhất định, nhưng tôi vẫn hơi bí ẩn về việc chính xác khi nào trình tối ưu hóa sẽ làm như vậy.

Câu trả lời:


13

Bạn nên nối EXPLAIN EXTENDEDtrước khi truy vấn và xem kết quả.

Nó nên có một mục cho

  • khả năng

Nếu cột này là NULL, không có chỉ mục liên quan. Trong trường hợp này, bạn có thể cải thiện hiệu năng truy vấn của mình bằng cách kiểm tra mệnh đề WHERE để kiểm tra xem nó có đề cập đến một số cột hoặc cột nào phù hợp để lập chỉ mục hay không.

  • Chìa khóa

Cột khóa cho biết khóa (chỉ mục) mà MySQL thực sự quyết định sử dụng. Nếu MySQL quyết định sử dụng một trong các chỉ mục could_keys để tra cứu các hàng, thì chỉ mục đó được liệt kê là giá trị khóa.

Để biết thêm thông tin, bạn có thể tham khảo Giải thích đầu ra nàyGiải thích về jo_types


Tôi hiểu, câu hỏi của tôi cụ thể, là để làm với mệnh đề ORDER BY. Truy vấn của tôi đang sử dụng chỉ mục được chỉ định để hạn chế các hàng được trả về nhưng được cung cấp hiệu suất của loại tôi đoán rằng nó không sử dụng nó cho mệnh đề ORDER BY.
Chris Cooper

1
Trong một số trường hợp, MySQL có thể sử dụng một chỉ mục để đáp ứng mệnh đề ORDER BY mà không cần thực hiện bất kỳ sắp xếp bổ sung nào. Chỉ mục cũng có thể được sử dụng ngay cả khi ORDER BY không khớp chính xác với chỉ mục, miễn là tất cả các phần không được sử dụng của chỉ mục và tất cả các cột ORDER BY bổ sung là các hằng số trong mệnh đề WHERE. Các truy vấn sau sử dụng chỉ mục để giải quyết phần ORDER BY tham khảo dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil

1

Bạn sử dụng EXPLAINtrên truy vấn của bạn ( explain select-or-whatever-your-query-is).

possible_keyshiển thị những cái có thể được sử dụng, keycái thực sự được sử dụng.


1
Để thêm vào đó: explain format=json select ...thậm chí còn mạnh mẽ hơn. Nó bao gồm used_key_parts, cho bạn biết liệu một khóa tổng hợp đã được sử dụng một phần hay toàn bộ và index_conditionsẽ cho bạn biết phần nào của truy vấn chịu trách nhiệm về chỉ mục nào.
okdewit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.