Помогите ПОНЯТЬ индексы в СУБД

Духовность™

Продвинутый новичок
Помогите ПОНЯТЬ индексы в СУБД

Привет всем.

У меня проблема с индексами, я не могу их познать даже на тривиальном уровне, просто ну никак не могу до конца их осознать и понять! Надеюсь, поможете мне с ними разобраться. Замучился уже чесслово.

Имеем простейшую таблицу:

Код:
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 вот такого запроса, по всем полям:

Код:
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
Замечательно! До кучи и на varchar ставлю индекс:

[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 полям. Возникает второй вопрос - что лучше выбрать многостолбцовый индекс или частный?

В общем, непонятно мне нехрена идеология этих индексов :((
 

weregod

unserializer
если у Вас будут запросы с условием на все три колонки, составной индекс оправдан.
 
Сверху