Насколько я знаю, вы НЕ МОЖЕТЕ РАЗДЕЛИТЬ раздел на char / varchar / text.
Что вы можете сделать, это добавить столбец int с именем ascii_value. Затем создайте триггер перед вставкой / обновлением, который обновит столбец ascii_value значением ASCII первой буквы в строке.
Теперь вы можете разбить таблицу на столбец ascii_value.
Если вы хотите пойти дальше и создать разделы, основанные на комбинации первых букв, например
аа
аб
переменный ток
Объявление
Тогда вы можете сделать это:
ascii_value = ascii_value_of_first_letter<<8 + ascii_value_of_second_letter
для трех букв:
ascii_value = ascii_value_of_first_letter<<16 + ascii_value_of_second_letter<<8 + ascii_value_of_third_letter
Как вы можете видеть, ограничение этой схемы - количество битов, доступных в поле ascii_value
. Но это не будет проблемой, поскольку вы исчерпали бы количество допустимых разделов, прежде чем исчерпали биты в поле ascii_value
.
Это нормально, если вы создаете HASH-разделы. Для диапазона rangeg лучше сделать что-то вроде этого
ascii_value = (ascii_value_of_first_letter_in_uppercase - 65)*26 + ascii_value_of_second_letter_in_uppercase -65
Это даст непрерывный диапазон значений.
При запросе вам придется применить ту же логику к строке, которую вы пытаетесь найти. Добавьте условие в предложение where, которое фильтрует результаты на основе поля ascii_value
. Это удалит ненужные разделы.
Используйте EXPLAIN PARTITIONS
, чтобы увидеть, удаляются ли разделы.
PS: вам нужно будет добавить ascii_value
к первичному ключу.
Надеюсь, это поможет:)