Я намагаюся індексувати свою blogentries
базу даних для кращої продуктивності, але знайшов проблему.
Ось структура:
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;
Запит, як наведено нижче, правильно використовує індекс:
EXPLAIN SELECT id_id,title_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | id | select_type | стіл | тип | можливі_ключі | ключ | key_len | посилання | ряди | Додатковий | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | 1 | ПРОСТО | блогери | індекс | NULL | ПЕРШИЙ | 114 | NULL | 126 | Використання індексу | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- +
Тим НЕ менше, коли я додаю entry_id
в SELECT
запиті він використовує FileSort
EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | id | select_type | стіл | тип | можливі_ключі | ключ | key_len | посилання | ряди | Додатковий | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | 1 | ПРОСТО | блогери | ВСІ | NULL | NULL | NULL | NULL | 126 | Використання файлів | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- +
Мені було цікаво, чому це відбувається і як я можу цього уникнути? Це пов'язано з тим VarChar
, що потрібно змінити на щось інше?
Я намагаюсь, щоб усі мої запити використовували індекс, коли я стикаюся з високими Handler_read_rnd
та Handler_read_rnd_next
значеннями.
Якщо вам потрібна будь-яка інша інформація, я також можу розмістити її.
WHERE 1=1
до свого другого запиту.