Tôi đang cố gắng lập chỉ mục blogentries
cơ 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_id
vào SELECT
truy 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_rnd
và Handler_read_rnd_next
giá 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=1
vào truy vấn thứ hai của bạn.
SELECT @@sort_buffer_size
) là gì?