2013-01-03 34 views
6

Tôi muốn chọn nội dung của cột text từ entrytable.Làm thế nào để giải thích đầu ra của MySQL GIẢI THÍCH?

EXPLAIN SELECT text 
FROM entrytable 
WHERE user = 'username' && 
`status` = '1' && (
    `status_spam_user` = 'no_spam' 
    || (
     `status_spam_user` = 'neutral' && 
     `status_spam_system` = 'neutral' 
    ) 
) 
ORDER BY datum DESC 
LIMIT 6430 , 10 

bảng có ba chỉ số:

  • index_user (người dùng)
  • index_datum (cột mốc)
  • index_status_mit_spam (trạng thái, status_spam_user, status_spam_system)

Các GIẢI THÍCH kết quả là:

id select_type  table  type possible_keys      key   key_len  ref  rows Extra 
1 SIMPLE   entrytable ref  index_user,index_status_mit_spam index_user 32   const 7800 Using where; Using filesort 
  • possible_keys chỉ mục MySQL có thể muốn sử dụng và keys chỉ mục MySQL thực sự sử dụng?
  • Tại sao chỉ mục index_status_mit_spam không được sử dụng? Trong truy vấn, các colums có cùng thứ tự như trong chỉ mục, ...
  • Tại sao chỉ mục index_datum không được sử dụng cho ORDER BY?
  • Làm cách nào để tối ưu hóa chỉ mục bảng hoặc truy vấn? (Các truy vấn trên cần đến 3 giây có khoảng một triệu mục trong bảng)

Trả lời

4

Trả lời câu hỏi của bạn:

  • possible_keys các chỉ số MySQL có thể muốn sử dụng và keys các chỉ số MySQL thực sử dụng? Vâng cái này đúng rồi.

  • Tại sao chỉ mục index_status_mit_spam không được sử dụng? Trong truy vấn, các colums có cùng thứ tự như trong chỉ mục. SQL sử dụng thống kê trên các chỉ mục của bảng để xác định chỉ mục nào sẽ sử dụng. Thứ tự của các trường trong câu lệnh chọn không có hiệu lực để sử dụng chỉ mục nào. Thống kê xung quanh các chỉ mục bao gồm các thông tin như tính duy nhất của chỉ mục và những thứ khác. Nhiều chỉ số unqiue có thể sẽ được sử dụng. Đọc thêm về điều này tại đây: http://dev.mysql.com/doc/innodb/1.1/en/innodb-other-changes-statistics-estimation.html hoặc tại đây: http://dev.mysql.com/doc/refman/5.0/en//myisam-index-statistics.html. Những yếu tố này xác định cách MySQL sẽ chọn một chỉ mục để sử dụng. Nó sẽ chỉ sử dụng ONE chỉ số.

  • Tại sao chỉ mục index_datum không được sử dụng cho ORDER BY? MySQL sẽ chỉ sử dụng một chỉ mục không phải là hai trong một truy vấn khi sử dụng chỉ mục thứ hai sẽ làm chậm truy vấn hơn nữa. Đọc một chỉ mục là KHÔNG đọc bảng. Điều này liên quan đến hiệu quả hoạt động của truy vấn. Dưới đây là câu trả lời có thể giải thích một số khái niệm: https://dba.stackexchange.com/questions/18528/performance-difference-between-clustered-and-non-clustered-index/18531#18531 Hoặc Adding limit clause to MySQL query slows it down dramatically Hoặc MySQL indexes and when to group them. Những câu trả lời này có rất nhiều chi tiết sẽ giúp bạn hiểu lập chỉ mục MySQL.

  • Làm cách nào để tối ưu hóa chỉ mục bảng hoặc truy vấn? (Truy vấn ở trên cần đến 3 giây có khoảng một triệu mục trong bảng). Vâng, có một tập tin ở đây có thể làm chậm bạn xuống. Có thể là bảng có quá nhiều chỉ mục và MySQL đang chọn một chỉ mục sai.

Bạn cần hiểu rằng các chỉ mục tăng tốc độ đọc và làm chậm ghi vào bảng. Vì vậy, chỉ cần thêm các chỉ mục không phải lúc nào cũng là một ý tưởng hay. Các câu trả lời và con trỏ ở trên sẽ giúp bạn hiểu rõ hơn.

1
  • possible_keys biểu thị tất cả các chỉ số của bảng của bạn (phím hoặc cột index)
  • MySQL ưu quyết định cách tốt nhất để thực hiện một truy vấn, nó có thể sử dụng bất kỳ chỉ số (khóa chính không cần thiết), hoặc không có
  • buộc MySQL sử dụng hoặc bỏ qua một chỉ số được liệt kê trong cột possible_keys, sử dụng FORCE INDEX, USE INDEX, hoặc IGNORE INDEX trong truy vấn của bạn
  • Kiểm tra liên kết này - http://dev.mysql.com/doc/refman/5.1/en/index-hints.html.

    Bạn có thể chỉ định phạm vi của gợi ý chỉ mục bằng cách thêm mệnh đề FOR ​​vào gợi ý. Điều này cung cấp quyền kiểm soát chi tiết hơn về việc lựa chọn trình tối ưu hóa của một trình tối ưu hóa cho các giai đoạn xử lý truy vấn khác nhau. Để chỉ ảnh hưởng đến các chỉ mục được sử dụng khi MySQL quyết định cách tìm các hàng trong bảng và cách xử lý các phép nối, hãy sử dụng FOR JOIN. Để ảnh hưởng đến việc sử dụng chỉ mục để sắp xếp hoặc nhóm các hàng, hãy sử dụng FOR ORDER BY hoặc FOR GROUP BY. (Tuy nhiên, nếu có chỉ mục bao trùm cho bảng và được sử dụng để truy cập vào bảng, trình tối ưu hóa sẽ bỏ qua gợi ý IGNORE INDEX FOR {ORDER BY | GROUP BY} để vô hiệu hóa chỉ mục đó.)

  • Hãy thử buộc chỉ số khác nhau - kiểm tra liên kết này cho chắc chắn - MySQL `FORCE INDEX` use cases?

  • Hiểu GIẢI THÍCH định dạng đầu ra - http://dev.mysql.com/doc/refman/5.1/en/explain-output.html

+2

* "possible_keys biểu thị tất cả các chỉ số của bảng của bạn (phím hoặc cột index)" * - không đúng sự thật. Nó biểu thị các chỉ mục có thể được sử dụng cho truy vấn được đề cập. – Madbreaks