Đầu ra EXPLAIN cho thấy rằng chỉ mục của tôi không được sử dụng


9

Tôi đã thiết lập bảng của mình chỉ với một chỉ mục trên did_status (doing_status = INT):

nhập mô tả hình ảnh ở đây

Khi tôi sử dụng:

EXPLAIN SELECT * FROM reminder  WHERE done_status=2

Tôi lấy lại cái này:

id select_type loại bảng có thể_key key key_len ref rows Extra
1 nhắc nhở SIMPLE TẤT CẢ xong_status NULL NULL NULL 5 Sử dụng ở đâu

Nhưng khi tôi ban hành lệnh này:

EXPLAIN SELECT * FROM reminder  WHERE done_status=1

Tôi nhận được trả lại như sau:

id select_type loại bảng có thể_key key key_len ref rows Extra
1 nhắc nhở SIMPLE ref xong_status xong_status 4 const 2   

Các EXPLAINchương trình với tôi rằng nó sử dụng 5 hàng, lần thứ hai 2 hàng.

Tôi không nghĩ rằng chỉ số được sử dụng, nếu tôi hiểu nó ngay lần đầu tiên, nó sẽ cho tôi 3 hàng. Tôi làm gì sai?

SHOW INDEX FROM reminder:

Bảng Non_unique Key_name Seq_in_index Cột_name Collation Cardinality Sub_part Đóng gói Null Index_type Nhận xét Index_comment
nhắc nhở 1 xong_status 1 xong_status A 5 NULL NULL BTREE

giải thích mở rộng:

id select_type loại bảng could_keys key key_len ref hàng được lọc Thêm
1 nhắc nhở SIMPLE ref xong_status xong_status 4 const 2 100.00

show warnings không cho thấy bất cứ điều gì quan tâm.


Hãy tin tôi chỉ số hoạt động. Nhưng tôi không thể nhìn thấy bất cứ điều gì dễ dàng trong ảnh chụp màn hình của bạn - bạn có thể thực hiện "hiển thị chỉ mục từ tài khoản của bạn"

yeah đã chỉnh sửa câu hỏi của tôi

vui lòng sử dụng glorify \ G cho lược đồ và giải thích kết quả của kế hoạch, nó sẽ dễ đọc hơn
ajreal

Bạn có thể lặp lại với sự quan tâm với "giải thích mở rộng" và "cảnh báo hiển thị", điều này sẽ hiển thị các lựa chọn SQL thực tế mà SQL chọn

@ajreal tôn vinh cái gì?

Câu trả lời:


4

Bạn hiểu sai trường 'hàng' là gì. Đó là số lượng hàng mà mysql ước tính cần đọc để đáp ứng truy vấn của bạn. Giá trị này có thể khá không chính xác. Điều đó không có nghĩa đây là số lượng hàng trong kết quả - hoặc số lượng hàng thực tế được đọc bởi mysql


Vì thế? Tôi đã nói nó ở đâu? Những gì trình tối ưu hóa chọn là tùy thuộc vào nó? Chỉ số vẫn hoạt động.

@ajreal Điều đó không có nghĩa là chỉ số bị hỏng. Chỉ cần tối ưu hóa chọn (trong tâm trí của nó) cách hiệu quả nhất để truy vấn dữ liệu. Tôi giả sử OP đang mong đợi cột hàng trong EXPLAIN là chính xác. Điều đó không có nghĩa là chỉ mục bị hỏng - chỉ là mysql chọn không sử dụng nó (có thể).

1
@ajreal: Tôi đang thiếu một cái gì đó trong điểm của bạn. Cột hàng của một giải thích không có gì để làm với các chỉ mục phải không? Mysql chọn không sử dụng chỉ mục (có thể tất cả dữ liệu nằm trong một trang). Không chắc chắn tôi hiểu quan điểm của bạn? Tối ưu hóa truy vấn trên bảng 5 hàng sẽ tạo ra một số kết quả 'lẻ' vì việc bạn tối ưu hóa khá nhiều không quan trọng.


Trong trường hợp này ai quan tâm chỉ số nào tối ưu hóa chọn? Không có gì sai với chính chỉ mục, bởi vì trình tối ưu hóa cảm thấy như nó không cần nó - nó có vấn đề gì?

3

Đồng bằng thực thi đầu tiên không sử dụng chỉ mục cho chắc chắn,
đó có thể là information_schema.statistic trên chỉ mục không theo kịp dữ liệu sau một số thao tác ghi hoặc bảng không được truy cập trong một thời gian dài.

như giải thích ở đây: - Trình tối ưu hóa truy vấn MySQL đọc số liệu thống kê chỉ mục từ đâu?

đối với kế hoạch thực hiện thứ hai, có vẻ như information_schema.statistic đã bắt kịp và khắc phục vấn đề về tim mạch NULL.

Do đó, là thực hiện truy vấn theo trình tối ưu hóa chỉ mục.

Đối với bảng có hàng nhỏ, nó không quan trọng lắm.
Nhưng dữ liệu sẽ tăng trưởng, nhà phát triển phải luôn kiểm tra điều này
và thực hiện bảng phân tích cần thiết khi số lần gặp gỡ không có giá trị trên chỉ mục.


0

Kế hoạch thực hiện đầu tiên không sử dụng một chỉ mục.

Từ trang web tham khảo MySQL :

Đôi khi MySQL không sử dụng một chỉ mục, ngay cả khi có sẵn. Một tình huống trong đó xảy ra là khi trình tối ưu hóa ước tính rằng việc sử dụng chỉ mục sẽ yêu cầu MySQL truy cập một tỷ lệ rất lớn của các hàng trong bảng. (Trong trường hợp này, quá trình quét bảng có thể nhanh hơn nhiều vì yêu cầu tìm kiếm ít hơn.) Tuy nhiên, nếu truy vấn đó sử dụng LIMIT để chỉ truy xuất một số hàng, dù sao thì MySQL cũng sử dụng chỉ mục, vì nó có thể tìm thấy nhanh hơn nhiều một vài hàng để trả về kết quả

Nếu bảng của bạn chỉ có 5 hàng và truy vấn của bạn chọn 3 trong số đó, thì trình tối ưu hóa MySQL giả định rằng việc quét toàn bộ bảng sẽ hiệu quả hơn.

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.