2010-05-27 44 views
8

Tôi phải xóa khoảng 10 nghìn hàng từ một bảng có hơn 100 triệu hàng dựa trên một số tiêu chí. Khi tôi thực hiện truy vấn, nó mất khoảng 5 phút. Tôi đã chạy một kế hoạch giải thích (truy vấn delete được chuyển đổi thành select * vì MySQL không hỗ trợ explain delete) và thấy rằng MySQL sử dụng chỉ mục sai.MySQL, xóa và gợi ý chỉ mục

Câu hỏi của tôi là: có cách nào để cho MySQL biết chỉ mục nào sẽ sử dụng trong khi xóa không? Nếu không, tôi sẽ làm gì? Chọn bảng tạm thời sau đó xóa khỏi bảng tạm thời?

+0

Đảm bảo rằng bạn có khóa chính và cột được đặt tên trong mệnh đề WHERE của việc xóa của bạn được lập chỉ mục. –

Trả lời

4

index hint syntax. //ETA: sadly, not for deletes

ETA: Bạn đã thử chạy ANALYZE TABLE $mytable chưa?

Nếu điều đó không trả hết, tôi nghĩ bạn có 2 lựa chọn: Thả chỉ mục vi phạm trước khi xóa và tạo lại sau. Hoặc THAM GIA bảng xóa của bạn vào một bảng khác trên chỉ mục mong muốn, để đảm bảo rằng chỉ mục mong muốn được sử dụng.

+1

Có, nhưng gợi ý chỉ mục hiểu biết của tôi không hoạt động đối với các báo cáo xóa. –

+0

@Manuel Darveau: Drat! vừa thử nghiệm nó. Bạn nói đúng. – dnagirl

2

Tôi chưa bao giờ thực sự bắt gặp một tình huống mà MySQL đã chọn chỉ mục sai, mà là sự hiểu biết của tôi về cách các chỉ mục hoạt động thường có lỗi.

Bạn có thể muốn kiểm tra cuốn sách này: http://oreilly.com/catalog/9780596003067

Nó có một phần tuyệt vời về cách làm việc chỉ số và các tùy chọn điều chỉnh khác.

+0

+1, cuốn sách mở ra đôi mắt của bạn về nhiều điều bạn sẽ không bao giờ nghĩ đến. – newtover

+0

Chỉnh sửa, dnagirl là đúng về cú pháp gợi ý chỉ mục, tôi không biết rằng nó đã hoạt động. – UltimateBrent

+0

Tôi đã thấy mysql chọn chỉ mục sai nhiều lần. Đối với chúng tôi nó xảy ra trên một bảng lớn (15M hàng) có rất nhiều chỉ mục tương tự (15 chỉ mục). Có lẽ một kịch bản điên rồ --- có một lý do --- và nó chỉ số sai thường xuyên, ngay cả khi sự lựa chọn để chọn nên là CHÍNH THỨC. –