2011-12-22 32 views
5

Tôi có tuyên bố SELECT mà tôi muốn tối ưu hóa. mysql - order by optimization nói rằng trong một số trường hợp, chỉ mục không thể được sử dụng để tối ưu hóa ORDER BY. Cụ thể điểm:Việc tối ưu hóa ORDER BY có hiệu lực trong câu lệnh SELECT sau đây không?

Bạn sử dụng ORDER BY trên các bộ phận không liên tiếp của một phím
SELECT * FROM t1 ĐÂU khóa2 = hằng ORDER BY key_part2;

làm cho tôi suy nghĩ, điều này có thể đúng. Tôi đang sử dụng các chỉ số sau:

UNIQUE KEY `met_value_index1` (`RTU_NB`,`DATETIME`,`MP_NB`), 
KEY `met_value_index` (`DATETIME`,`RTU_NB`) 

Với sau SQL tuyên bố:

SELECT * FROM met_value 
WHERE rtu_nb=constant 
AND mp_nb=constant 
AND datetime BETWEEN constant AND constant 
ORDER BY mp_nb, datetime 
  • Nó sẽ được xóa đủ chỉ số met_value_index1 và tạo ra nó với mới ra lệnh cho RTU_NB, MP_NB, DATETIME?
  • Tôi có phải đưa RTU_NB vào mệnh đề ORDER BY không?


Kết quả: Tôi đã thử những gì @meriton gợi ý và bổ sung các chỉ số met_value_index2. Các SELECT hoàn thành sau 1,2 giây, trước đó nó hoàn thành sau 5.06 giây. Sau đây không thuộc về câu hỏi nhưng là một lưu ý phụ: Sau khi một số cố gắng khác tôi chuyển động cơ từ MyISAM sang InnoDB - với rtu_nb, mp_nb, datetime làm khóa chính - và câu lệnh hoàn thành sau 0,13 giây!

Trả lời

1

Tôi không nhận được truy vấn của bạn. Nếu một hàng phải khớp với mp_np = constant để được trả lại, tất cả các hàng được trả về sẽ có cùng một mp_nb, vì vậy, bao gồm cả mp_nb theo thứ tự theo mệnh đề không có hiệu lực. Tôi khuyên bạn nên sử dụng câu lệnh ngữ nghĩa tương đương:

SELECT * FROM met_value 
WHERE rtu_nb=constant 
AND mp_nb=constant 
AND datetime BETWEEN constant AND constant 
ORDER BY datetime 

để tránh không cần nhầm lẫn trình tối ưu hóa truy vấn.

Bây giờ, đối với câu hỏi của bạn: Cơ sở dữ liệu có thể thực hiện đơn hàng theo mệnh đề mà không phân loại nếu nó biết rằng truy cập cơ bản sẽ trả về các hàng theo thứ tự thích hợp. Trong trường hợp các chỉ mục, điều đó có nghĩa là một chỉ mục có thể hỗ trợ phân loại nếu các hàng khớp với mệnh đề where xuất hiện trong chỉ mục theo thứ tự được mệnh đề theo thứ tự yêu cầu.

Đây là trường hợp ở đây, vì vậy cơ sở dữ liệu thực sự có thể quét phạm vi chỉ mục trên met_value_index1 cho các hàng ở đó rtu_nb=constant AND datetime BETWEEN constant AND constant và sau đó kiểm tra xem có mp_nb=constant cho mỗi hàng không. nếu mp_nb=constant có tính chọn lọc cao.Nói cách khác, chỉ mục hữu ích nhất nếu các hàng phù hợp tiếp giáp trong chỉ mục, vì điều đó có nghĩa là quét phạm vi chỉ mục sẽ chỉ chạm vào các hàng thực sự cần được trả về.

Chỉ số sau đây sẽ do đó hữu ích hơn cho truy vấn này:

UNIQUE KEY `met_value_index2` (`RTU_NB`,`MP_NB`, `DATETIME`), 

như tất cả các hàng phù hợp sẽ ngay bên cạnh nhau trong chỉ mục và các hàng xuất hiện trong chỉ mục theo thứ tự mệnh đề order by yêu cầu. Tôi không thể nói liệu trình tối ưu hóa truy vấn có đủ thông minh để có được điều đó, vì vậy bạn nên kiểm tra kế hoạch thực hiện.

+0

Cảm ơn bạn đã giải thích và gợi ý. Tôi sẽ thử nó và báo cáo kết quả càng sớm càng tốt - hiện tại máy từ xa đã tắt nguồn - và tôi tò mò, điều gì sẽ thay đổi. –

0

Thứ tự của các trường khi chúng xuất hiện trong mệnh đề WHERE phải khớp với thứ tự trong chỉ mục. Vì vậy, với truy vấn hiện tại của bạn, bạn cần một chỉ mục với các trường theo thứ tự của rtu_nb, mp_nb, datetime.

+0

[Điều này không đúng] (http://stackoverflow.com/questions/3805863/order-of-ands-in-where-clause-for-greatest-performance) và cũng không liên quan đến câu hỏi. –

+0

Trong MySQL, nó hoàn toàn đúng. Nó đặc biệt đúng đối với các chỉ số động cơ innodb. Xem meritons trả lời hoặc đọc sách giáo khoa Zawodnys về vấn đề này. – Anony

1

Tôi không nghĩ rằng nó sẽ sử dụng bất kỳ chỉ mục nào cho ORDER BY. Nhưng bạn nên nhìn vào số execution plan. Hoặc here.

Các vấn đề liên quan