SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.02.2012 09:26:41

stasuss
Участник
Зарегистрирован: 30.11.2011
Сообщений: 10

длинна индексов

ногами не пинайте, если я туплю жестоко.

почитал много чего про индексы, но толком ничего про длину не нашел. везде пишут что экспериментально подбирается.

решил поэкспериментировать над одной колонкой в таблице небольшой (по количеству колонок). в ней примерно 800 тысяч строк. в строке содержится число, но в виде varchar ибо поиск может быть и по части. максимум 3 цифры до точки и две после.

начал с длины индекса в 3 символа. кардиналити получился высокий. выполнил запрос. записал все показатели. сменил длинну на 2. кардиналити резко упал. время запроса выросло. сменил на 4. кардиналити оказался ниже чем у 3, но выше чем у 2. потом сменил на 3 опять и кардиналити был уже в разы меньше чем в первый раз когда я ставил эту длину индексу. да и время запроса увеличилось.

затем я еще несколько раз попробовал поменять длину. результаты всегда ужасно отличались. никакой закономерности выделить не получилось.

вопрос: объясните дураку почему такая фигня и как в данной ситуации всетаки выбрать длинну у индекса?

спасибо

сейчас вот вообще было так: поставил длину 3 - кардиналити 450. поставил 4 - 23496. вернул на место 3 - получил кардиналити 17. ничего не понимаю. что тут еще получается как повезет со звездами при создании индекса?)))

Отредактированно stasuss (03.02.2012 09:55:04)

Неактивен

 

#2 03.02.2012 15:05:23

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: длинна индексов

Хм, а не проще ли хранить число в виде числа, а не в виде строки?
Что касается длины индекса, то можно создать индекс длиной количество символов в varchar - хуже не будет.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 03.02.2012 15:23:59

stasuss
Участник
Зарегистрирован: 30.11.2011
Сообщений: 10

Re: длинна индексов

ну а все таки почему такая разница в кардиналити? невозможно контролировать полезность индекса при подборе длинны

Неактивен

 

#4 03.02.2012 15:27:12

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: длинна индексов

чем больше длина индекса тем выше кардиналити. Почему разница? Ну если у Вас индекс только на первый символ, то кардиналити не должен быть выше 10 (ибо вариантов всего 10, от символа '0' до символа '9'), если на первые два, то соответственно кардиналити не больше 100. Если Вы ставите индекс на всю длину, то Вы получаете максимальную полезность индекса.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 03.02.2012 18:00:52

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: длинна индексов

stasuss написал:

сейчас вот вообще было так: поставил длину 3 - кардиналити 450. поставил 4 - 23496. вернул на место 3 - получил кардиналити 17. ничего не понимаю. что тут еще получается как повезет со звездами при создании индекса?)))

А таблица innodb или myisam?
Cardinality - это оценочная величина, статистику можно перестроить с помощью оператора ANALYZE TABLE

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson