Próbuję zindeksować blogentries
bazę danych w celu zwiększenia wydajności, ale znalazłem problem.
Oto struktura:
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;
Zapytanie takie jak poniżej poprawnie używa indeksu:
EXPLAIN SELECT id_id,title_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | id | wybierz typ | stół | typ | możliwe klucze | klucz | key_len | ref | rzędy | Extra | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | 1 | PROSTE | blogentries | indeks | NULL | PODSTAWOWE | 114 | NULL | 126 | Korzystanie z indeksu | + ---- + ------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- +
Jednak gdy dodam zapytanie entry_id
do SELECT
zapytania, używa on pliku
EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | id | wybierz typ | stół | typ | możliwe klucze | klucz | key_len | ref | rzędy | Extra | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | 1 | PROSTE | blogentries | WSZYSTKIE | NULL | NULL | NULL | NULL | 126 | Korzystanie z sortowania plików | + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- +
Zastanawiałem się, dlaczego tak się dzieje i jak mogę tego uniknąć? Czy to z powodu VarChar
i należy to zmienić na coś innego?
Usiłuję, aby wszystkie moje zapytania korzystały z indeksu, ponieważ uruchamiam wysokie wartości Handler_read_rnd
i Handler_read_rnd_next
wartości.
Jeśli potrzebujesz innych informacji, też mogę je opublikować.
WHERE 1=1
do drugiego zapytania.