Tôi có một bảng INNODB levels
:
+ -------------------- + -------------- + ------ + ----- + --------- + ------- + | Lĩnh vực | Loại | Không | Chìa khóa | Mặc định | Thêm | + -------------------- + -------------- + ------ + ----- + --------- + ------- + | id | int (9) | KHÔNG | PRI | NULL | | | level_name | varar (20) | KHÔNG | | NULL | | | user_id | int (10) | KHÔNG | | NULL | | | tên người dùng | varar (45) | KHÔNG | | NULL | | | đánh giá | số thập phân (5,4) | KHÔNG | | 0,0000 | | | phiếu bầu | int (5) | KHÔNG | | 0 | | | vở kịch | int (5) | KHÔNG | | 0 | | | date_published | ngày | KHÔNG | MUL | NULL | | | user_comment | varchar (255) | KHÔNG | | NULL | | | playable_character | int (2) | KHÔNG | | 1 | | | được bảo vệ | tí hon (1) | KHÔNG | MUL | 0 | | + -------------------- + -------------- + ------ + ----- + --------- + ------- +
Có ~ 4 triệu hàng. Do chức năng front-end, tôi cần truy vấn bảng này với nhiều bộ lọc và sắp xếp khác nhau. Họ đang ở trên playable_character
, rating
, plays
, và date_published
. Có date_published
thể được lọc để hiển thị vào ngày cuối cùng, tuần, tháng hoặc bất cứ lúc nào (3 năm qua). Ngoài ra còn có phân trang. Vì vậy, tùy thuộc vào lựa chọn của người dùng, ví dụ, các truy vấn có thể trông giống như một trong những truy vấn sau:
SELECT * FROM levels
WHERE playable_character = 0 AND
date_published BETWEEN date_sub(now(), INTERVAL 3 YEAR) AND now()
ORDER BY date_published DESC
LIMIT 0, 1000;
SELECT * FROM levels
WHERE playable_character = 4 AND
date_published BETWEEN date_sub(now(), INTERVAL 1 WEEK) AND now()
ORDER BY rating DESC
LIMIT 4000, 1000;
SELECT * FROM levels
WHERE playable_character = 5 AND
date_published BETWEEN date_sub(now(), INTERVAL 1 MONTH) AND now()
ORDER BY plays DESC
LIMIT 1000, 1000;
Tôi nên thêm nó rating
và plays
luôn luôn được yêu cầu như DESC
. Chỉ date_published
có thể là DESC
hay ASC
.
Tôi đã bắt đầu với một chỉ mục idx_date_char(date_published, playable_character)
hoạt động tốt trên truy vấn ví dụ đầu tiên ở đây. Dựa trên một số câu trả lời khác, tôi đã thay đổi thành hai chỉ mục khác (date_published, playable_character, Plays) và (date_published, playable_character, rating).
Truy vấn đầu tiên vẫn chạy rất nhanh, tuy nhiên có một số điều bất thường xảy ra trong EXPLAIN, khi player_character = x vượt quá một số hàng nhất định (~ 700.000): SỬ DỤNG WHERE xuất hiện trong EXPLAIN.
Vì vậy, câu hỏi đầu tiên là có bất kỳ cải tiến nào trong truy vấn hoặc chỉ mục có thể không, và thứ hai, những gì cài đặt MySQL sẽ được thay đổi để cho phép các tập kết quả lớn.
Bất kỳ đề xuất đánh giá rất cao. TIA.