Насколько я знаю, вы не можете разделить раздел на char/varchar/text.
Что вы можете сделать, это добавить столбец int с именем ascii_value. Затем создайте перед триггером insert/update, который обновит столбец 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. Для диапазона partitiong, то лучше сделать что-то вроде этого
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
в Первичный ключ.
Надеюсь, что это поможет :)