|
Тема |
Re: индекси.....кога има и кога няма смисъл... [re: Topбaлaн] |
|
Автор | baj L\bo (Нерегистриран) | |
Публикувано | 12.03.03 16:45 |
|
|
въпроса пада малко общ, но:
индекс в/у (piс_id, member_id) ще се ползва от заявки, които имат
WHERE pic_id=PID , но не и от заявки които имат WHERE member_id=MID. По принцип, ако в WHERE клаузата не фигурира водещата колона на индекса, той няма да се използва. Причината е че листата на индекса са сортирани по ключа (напр. piс_id, member_id) и ако записите дето имат определена стойност за втората (третата..) колона не са събрани на едно място в индекса.
Така че ако очакваш много заявки по втората колона, хубаво е да направиш отделен индекс само по нея или дори по двете колони в обратен ред.
Индексите разбира се забавят инсертите, което при много активни таблици се вижда с просто око (не вярвам твоя случай да е такъв).
Когато създаваш нов индекс, хубаво е да се увериш че той се ползва (експлайн). Щото оптимизатора има хиляда причини да не ползва индекса.
За хиляда записа може да се окаже че табле скан е по-бързо: например ако да речем хиляда записа се събират на три страници и да речем записите които търсиш са на две от тях с индекс трябва да се прочете индексната страница + две стр. с данни -- пак три. Оптимизаторите осъзнават такива ситуации и праскат направо табле скан.
Друга често срещана грешка е водещата колона да е аргумент на функция -- индекса няма да се използва. Например тука някакъв гявол е кодирал в хиляди процедури нещо от типа на
WHERE pic_id=isnull(PID, pic_id)
демек, ако параметъра ПИД е зададен, избирай по него, ако не -- здраве. Това опростява кода, обаче обезсмисля индекса в/у пис-ид.
За да анализирам как се използват индексите, вземам логовете от да речем една седмица, извличам заявките от тях и ги изпълнявам на друг сървер така че да ми се генерира планът за изпълнение на куерито. Плановете ги парсвам и за всяка таблица на всяка заявка си запомням таблицата, индекса който се е ползвал (или табле скан) и какви буфери са се използвали. Това си го зареждам в една таблица и мога да я питам аджеба покажи ми случате на табле скан или покажи ми индексите дето не са се използвали никога -- може би трябва да ги махна.
|
| |
|
|
|