2012-01-20 3 views
10

Tôi lập chỉ mục thành bảng với hàng triệu bản ghi được sử dụng để tìm kiếm kết quả. Tôi đang hiển thị kết quả theo thứ tự ASC hoặc DESC. Câu hỏi của tôi là cột nên có chỉ mục hay không? Tôi có thêm 2 chỉ mục trên bảng đó. Hiệu suất sẽ ảnh hưởng như thế nào bằng cách tạo hoặc không lập chỉ mục cho cột đó?Đặt hàng theo cột phải có chỉ mục hay không?

+0

có thể trùng lặp của http://stackoverflow.com/questions/7475332/mysql-index-for-group- by-order-by –

+0

@Tichodroma: Tôi đã thấy câu hỏi đó trước đây về nhóm. Kịch bản của tôi là khác nhau. Tôi cần chỉ mục cho cột có điều kiện (ở đâu) cho bộ lọc tìm kiếm. –

Trả lời

9

Đặt hàng theo cột được sử dụng để đặt hàng bộ kết quả, chứ không phải lọc. Một chỉ mục trên các cột được đề cập trong mệnh đề theo thứ tự sẽ không thay đổi bất cứ điều gì, đặc biệt nếu nó không được sử dụng để lọc dữ liệu.

+0

: Cột đó cũng sẽ được sử dụng ở nơi có điều kiện. Sau đó, nó sẽ ảnh hưởng như thế nào đến độ phức tạp của truy vấn tìm kiếm? –

+0

Việc thêm chỉ mục sẽ giảm thời gian. Nếu không nhìn vào các kế hoạch thực thi truy vấn hoặc truy vấn thì không có cách nào để biết. – Sathya

+0

Ok. Tôi sẽ kiểm tra kế hoạch thực hiện truy vấn sau đó. Cảm ơn. –

3

Thực tế - đối với hàng triệu hàng tốt hơn để áp dụng một số chỉ số suy nghĩ tốt, nó không phải là tập dữ liệu lớn để bắt đầu lo lắng về các vấn đề về hiệu suất không gian.

nhưng

Nếu bạn đọc bảng mà mỗi ngày một lần và cập nhật/xóa dòng 100 lần mỗi giây - sau đó có hiệu lực từ chỉ số có thể làm suy giảm hiệu suất hoạt động chính, trong khi occasinally chọn sẽ thực hiện tốt hơn.

Vì vậy, câu trả lời như thường lệ - nó phụ thuộc

+0

Đó là logic bộ lọc tìm kiếm. Vì vậy, bảng sẽ được đọc 10.000 lần so với một lần viết. Tôi nên làm gì? –

+0

Chắc chắn có chỉ số tốt - là trường hợp của bạn –

0

Sử dụng ORDER BY trên cột được lập chỉ mục không phải là một ý tưởng tốt. Trên thực tế mục đích của việc sử dụng chỉ mục là làm cho tìm kiếm nhanh hơn để cột chỉ mục giúp duy trì dữ liệu theo thứ tự được sắp xếp. Tôi sẽ đề nghị bạn sử dụng ORDER BY tại cột không được lập chỉ mục. Tôi đã chạy một truy vấn mẫu trên MySql và nhận được kết quả như được đề cập dưới đây.

SELECT 
    ci.id AS item_id, ci.brand_id, ci.category_id, 
    ci.item_size_type, ci.is_express_processing, ci.packing, 
    ci.parent_service_id, ci.product_id, ci.size, 
    ci.create_date AS item_create_date, cis.service_id, cis.quantity 
FROM 
    cart AS c 
INNER JOIN 
    cart_items AS ci ON ci.cart_id = c.id 
LEFT JOIN 
    cart_item_services AS cis ON cis.item_id = ci.id 
WHERE 
    c.id = 144 
ORDER BY 
    c.create_date; 

Ở đây tôi đang sử dụng ORDER BY vào một tổ chức phi lập chỉ mục cột create_date và kết quả là như sau:

# Time: 2017-11-03T10:30:33.237056Z 
# [email protected]: root[root] @ localhost [] Id:  3 
# Query_time: 0.000340 
# Lock_time: 0.000154 Rows_sent: 2 Rows_examined: 4 

Và bây giờ tôi sẽ sử dụng ORDER BY trên một cột được lập chỉ mục item_id:

SELECT 
    ci.id AS item_id, ci.brand_id, ci.category_id, 
    ci.item_size_type, ci.is_express_processing, ci.packing, 
    ci.parent_service_id, ci.product_id, ci.size, 
    ci.create_date AS item_create_date, cis.service_id, cis.quantity 
FROM 
    cart AS c 
INNER JOIN 
    cart_items AS ci ON ci.cart_id = c.id 
LEFT JOIN 
    cart_item_services AS cis ON cis.item_id = ci.id 
WHERE 
    c.id = 144 
ORDER BY 
    item_id; 

Bây giờ tôi đã nhận được kết quả như sau.

# Time: 2017-11-03T10:30:47.802392Z 
# [email protected]: root[root] @ localhost [] Id:  3 
# Query_time: 0.000383 
# Lock_time: 0.000176 Rows_sent: 2 Rows_examined: 4 

Vì vậy, trong kết quả trên chúng ta có thể thấy các cột được lập chỉ mục Query_time và Lock_time cao hơn cột không được lập chỉ mục.

Đối với phân tích chi tiết về tiêu chuẩn truy vấn và hiệu suất mà bạn có thể tham khảo dưới đây liên kết:

http://mysql.rjweb.org/doc.php/index_cookbook_mysql