Estou tentando indexar meu blogentries
banco de dados para obter um melhor desempenho, mas encontrei um problema.
Aqui está a estrutura:
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;
Uma consulta como a seguinte usa o índice corretamente:
EXPLAIN SELECT id_id,title_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | id | select_type | mesa | tipo | possible_keys | chave key_len | ref linhas | Extra | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | 1 | SIMPLES | blogentries | índice | NULL PRIMÁRIO 114 NULL 126 Usando índice | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- +
No entanto, quando adiciono o entry_id
na SELECT
consulta, ele usa o filesort
EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | id | select_type | mesa | tipo | possible_keys | chave key_len | ref linhas | Extra | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | 1 | SIMPLES | blogentries | TUDO | NULL NULL NULL NULL 126 Usando filesort | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- +
Fiquei me perguntando por que isso está acontecendo e como posso evitá-lo? É devido ao VarChar
, e isso deve ser alterado para outra coisa?
Estou tentando fazer com que todas as minhas consultas usem o índice, pois estou com valores Handler_read_rnd
e Handler_read_rnd_next
altos.
Se você precisar de outras informações, também posso publicá-las.
WHERE 1=1
à sua segunda consulta.
SELECT @@sort_buffer_size
)?