Tôi đang gặp một số vấn đề biểu diễn khá lớn do việc sử dụng "ORDER BY" - câu lệnh trong mã SQL của tôi.MySQL không sử dụng chỉ mục ("Sử dụng filesort") khi sử dụng ORDER BY
Mọi thứ đều ổn miễn là tôi không sử dụng các câu lệnh BY ORDER trong SQL. Tuy nhiên, khi tôi giới thiệu ORDER BY: s trong mã SQL, mọi thứ đều chậm lại đáng kể do thiếu lập chỉ mục chính xác. Người ta cho rằng việc sửa chữa điều này sẽ là tầm thường, nhưng đánh giá từ các cuộc thảo luận diễn đàn, vv điều này có vẻ là một vấn đề khá phổ biến mà tôi chưa thấy câu trả lời dứt khoát và súc tích cho câu hỏi này.
Câu hỏi: Với bảng sau ...
CREATE TABLE values_table ( id int(11) NOT NULL auto_increment, ... value1 int(10) unsigned NOT NULL default '0', value2 int(11) NOT NULL default '0', PRIMARY KEY (id), KEY value1 (value1), KEY value2 (value2), ) ENGINE=MyISAM AUTO_INCREMENT=2364641 DEFAULT CHARSET=utf8;
... làm cách nào để tạo chỉ số sẽ được sử dụng khi truy vấn bảng cho một value1 trung cấp, trong khi sắp xếp trên giá trị của giá trị2?
Hiện tại, tìm nạp là OK khi KHÔNG sử dụng mệnh đề ORDER BY.
Xem ra QUERY sau GIẢI THÍCH:
OK, when NOT using ORDER BY: EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
However, when using ORDER BY I get "Using filesort": EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 order by this_.value2 asc limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where; Using filesort | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+
Một số thông tin bổ sung về nội dung bảng:
SELECT MIN(value1), MAX(value1) FROM values_table; +---------------+---------------+ | MIN(value1) | MAX(value2) | +---------------+---------------+ | 0 | 4294967295 | +---------------+---------------+ ... SELECT MIN(value2), MAX(value2) FROM values_table; +---------------+---------------+ | MIN(value2) | MAX(value2) | +---------------+---------------+ | 1 | 953359 | +---------------+---------------+
Xin vui lòng cho tôi biết nếu có thêm thông tin là cần thiết để trả lời câu hỏi .
Cảm ơn rất nhiều trước!
Update # 1: Thêm một chỉ số tổng hợp mới (ALTER TABLE values_table ADD INDEX (value1, value2);) không giải quyết được vấn đề. Bạn vẫn sẽ nhận được "Sử dụng filesort" sau khi thêm một chỉ mục như vậy.
Cập nhật # 2: Ràng buộc mà tôi không đề cập đến trong câu hỏi là tôi muốn thay đổi cấu trúc của bảng (nói thêm chỉ mục, v.v.) thay đổi truy vấn SQL được sử dụng. Các truy vấn SQL được tạo tự động bằng Hibernate, vì vậy hãy xem xét các truy vấn đó ít nhiều cố định.
Tôi giả sử bạn có nghĩa là value1, value2 trong bản cập nhật của bạn, phải không? – paxdiablo
Đừng bận tâm, điều đó sẽ không hoạt động được vì lời giải thích của @ Quassnoi về phạm vi giá trị1. Nó sẽ làm việc cho một giá trị duy nhất của value1 nhưng tôi đã không đọc câu hỏi đủ tốt. May mắn nhất. – paxdiablo
Bạn có sử dụng các trường trực tiếp trong truy vấn của mình hoặc bạn đang sử dụng các chức năng? Giống như trường dấu thời gian và TUẦN (dấu thời gian). –