Я пытаюсь проиндексировать свою 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 | ref | строки | Extra | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | 1 | ПРОСТО | Blogentries | индекс | NULL | ПЕРВИЧНЫЙ | 114 | NULL | 126 | Используя индекс | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- +
Тем не менее, когда я добавляю entry_id
в SELECT
запрос он использует файловую сортировку
EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | id | select_type | стол | тип | возможные_ключи | ключ | key_len | ref | строки | Extra | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | 1 | ПРОСТО | Blogentries | ВСЕ | NULL | NULL | NULL | NULL | 126 | Использование сортировки файлов | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- +
Мне было интересно, почему это происходит и как я могу избежать этого? Это из-за того VarChar
, и это должно быть изменено на что-то другое?
Я пытаюсь , чтобы все мои запросы используют индекс , как я бег в максимум Handler_read_rnd
и Handler_read_rnd_next
ценность.
Если вам нужна какая-либо другая информация, я тоже могу опубликовать ее.
WHERE 1=1
ко второму запросу.