Духовность™
Продвинутый новичок
Помогите ПОНЯТЬ индексы в СУБД
Привет всем.
У меня проблема с индексами, я не могу их познать даже на тривиальном уровне, просто ну никак не могу до конца их осознать и понять! Надеюсь, поможете мне с ними разобраться. Замучился уже чесслово.
Имеем простейшую таблицу:
заполняем какими-то значениями:
Делаем explain вот такого запроса, по всем полям:
получаем результ:
Плохо. Пытаемся оптимизировать.
Вот тут и не ясно мне становится - как правильно ставить индексы? Правильно ли я понимаю, что нужно смотреть, какие поля задействованы в where и по ним ставить индексы? Пробуем:
[sql]ALTER TABLE `test` ADD INDEX ( `f1` );[/sql]
делаем explain:
уже лучше. Создаем второй индекс:
[sql]ALTER TABLE `test` ADD INDEX ( `f2` );[/sql]
делаем explain:
Замечательно! До кучи и на varchar ставлю индекс:
[sql]ADD INDEX `f3` ( `f3` ( 5 ) );[/sql]
explain:
без изменений.
Вот тут то мне и не понятно, по какому принципу эти индексы в данном случае работают? Убираю индексы f1 и f3 - они не нужны. Но почему?
Дальше. Существуют индексы многостобцовые. В данном случае можно создать многостолбцовый индекс:
[sql]ALTER TABLE `test` ADD INDEX `myindex` ( `f1` , `f2` , `f3` ( 5 ) );[/sql]
его использование будет оправдано для запроса по всем 3 полям. Возникает второй вопрос - что лучше выбрать многостолбцовый индекс или частный?
В общем, непонятно мне нехрена идеология этих индексов
(
Привет всем.
У меня проблема с индексами, я не могу их познать даже на тривиальном уровне, просто ну никак не могу до конца их осознать и понять! Надеюсь, поможете мне с ними разобраться. Замучился уже чесслово.
Имеем простейшую таблицу:
Код:
CREATE TABLE test
(
id int unsigned not null primary key auto_increment,
f1 int unsigned not null,
f2 int unsigned not null,
f3 varchar(255) not null
);
Код:
insert into test set f1=11, f2=21, f3="test1";
insert into test set f1=12, f2=22, f3="test2";
insert into test set f1=13, f2=23, f3="test3";
insert into test set f1=14, f2=24, f3="test4";
insert into test set f1=15, f2=25, f3="test5";
insert into test set f1=16, f2=26, f3="test6";
insert into test set f1=17, f2=27, f3="test7";
insert into test set f1=18, f2=28, f3="test8";
insert into test set f1=11, f2=29, f3="test9";
insert into test set f1=12, f2=22, f3="test1";
insert into test set f1=13, f2=23, f3="test2";
insert into test set f1=14, f2=24, f3="test3";
insert into test set f1=15, f2=25, f3="test4";
insert into test set f1=16, f2=26, f3="test5";
insert into test set f1=17, f2=27, f3="test6";
insert into test set f1=18, f2=28, f3="test7";
insert into test set f1=11, f2=29, f3="test8";
insert into test set f1=12, f2=22, f3="test9";
Код:
explain select
*
from
test
where
f1 = 11
AND
f2 = 29
AND
f3 = "test9"
Код:
1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 18 | Using where
Вот тут и не ясно мне становится - как правильно ставить индексы? Правильно ли я понимаю, что нужно смотреть, какие поля задействованы в where и по ним ставить индексы? Пробуем:
[sql]ALTER TABLE `test` ADD INDEX ( `f1` );[/sql]
делаем explain:
Код:
1 | SIMPLE | test | ref | f1 | f1 | 4 | const | 3 | Using where
[sql]ALTER TABLE `test` ADD INDEX ( `f2` );[/sql]
делаем explain:
Код:
1 | SIMPLE | test | ref | f1,f2 | f2 | 4 | const | 2 | Using where
[sql]ADD INDEX `f3` ( `f3` ( 5 ) );[/sql]
explain:
Код:
1 | SIMPLE | test | ref | f1,f2,f3 | f2 | 4 | const | 2 | Using where
Вот тут то мне и не понятно, по какому принципу эти индексы в данном случае работают? Убираю индексы f1 и f3 - они не нужны. Но почему?
Дальше. Существуют индексы многостобцовые. В данном случае можно создать многостолбцовый индекс:
[sql]ALTER TABLE `test` ADD INDEX `myindex` ( `f1` , `f2` , `f3` ( 5 ) );[/sql]
его использование будет оправдано для запроса по всем 3 полям. Возникает второй вопрос - что лучше выбрать многостолбцовый индекс или частный?
В общем, непонятно мне нехрена идеология этих индексов
