Tôi đang cố gắng lập chỉ mục blogentriescơ sở dữ liệu của mình để có hiệu suất tốt hơn nhưng tìm thấy một vấn đề.
Đây là cấu trúc:
CREATE TABLE IF NOT EXISTS `blogentries` (
`id_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`title_id` varchar(100) COLLATE latin1_german2_ci NOT NULL,
`entry_id` varchar(5000) COLLATE latin1_german2_ci NOT NULL,
`date_id` int(11) NOT NULL,
PRIMARY KEY (`id_id`)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1
COLLATE=latin1_german2_ci
AUTO_INCREMENT=271;
Một truy vấn như sau sử dụng đúng chỉ mục:
EXPLAIN SELECT id_id,title_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | id | chọn_type | bàn | loại | có thể_key | chìa khóa | key_len | tham khảo | hàng | Thêm | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | 1 | ĐƠN GIẢN | blog | chỉ số | NULL | CHÍNH HÃNG | 114 | NULL | 126 | Sử dụng chỉ mục | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- +
Tuy nhiên, khi tôi thêm entry_idvào SELECTtruy vấn nó sử dụng filesort
EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | id | chọn_type | bàn | loại | có thể_key | chìa khóa | key_len | tham khảo | hàng | Thêm | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | 1 | ĐƠN GIẢN | blog | TẤT CẢ | NULL | NULL | NULL | NULL | 126 | Sử dụng fileort | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- +
Tôi đã tự hỏi tại sao điều này xảy ra và làm thế nào tôi có thể tránh nó? Có phải là do VarChar, và điều đó nên được thay đổi thành một cái gì đó khác?
Tôi cố gắng để có tất cả các truy vấn của tôi sử dụng các chỉ số như tôi đang chạy vào cao Handler_read_rndvà Handler_read_rnd_nextgiá trị.
Nếu bạn cần bất kỳ thông tin khác, tôi cũng có thể gửi nó.
WHERE 1=1vào truy vấn thứ hai của bạn.
SELECT @@sort_buffer_size) là gì?