индекс по части текстового поля mysql

Добрый день!

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

Заранее благодарен!

1 ответов


Оценить достаточную длину подстроки просто. Надо провести статистическое исследование своей базы. Посчитать, сколько уникальных значений будет при той или иной длине подстроки. И найти золотую середину между точностью и длиной.


select
  count(distinct str_field) as T0,
  count(distinct substr(str_field, 0, 1)) as T1,
  count(distinct substr(str_field, 0, 2)) as T2,
  count(distinct substr(str_field, 0, 3)) as T3,
...
  count(distinct substr(str_field, 0, 100)) as T100
from table;
 

T0 - число всех уникальных значений (если поле уникально, то число всех строк в таблице), как если бы индекс был построен по полю, а не его подстроке. Т1 - число уникальных значений по подстроке из одного символа; явно плохой вариант, даст всего лишь примерное число букв в алфавите. Постепенно увеличивая подстроку, вы будете сначала быстро, а затем все медленнее приближаться к числу T0. Можно даже график построить для наглядности.

Если текстовые поля большие и заполняются не шаблонно, можно сэкономить на объеме индекса. Но вот будет ли это эффективней... За точным значением поля придется лезть в таблицу, из самого индекса уже не прочитаешь.

Из соображений того, по скольки символам поля Вы собираетесь сортировать или сравнивать.
Если на текстовом поле индекс, то символы не помещающиеся в индекс не участвуют в сортировке или в сравнении.
То бишь
AAA
ABC
ABD

если по такому полю построить индекс по двум символам то :
AAA != ABC
ABC == ABD

А если по трем символам то

AAA != ABC
ABC != ABD