индекс по части текстового поля 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