2012-03-03 2 views
0

У меня есть любопытное таблицу, как это:Ошибка раздела Mysql?

CREATE TABLE test (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    user VARCHAR(30), 
    time VARCHAR(30), 
    status VARCHAR(30), 
    origin VARCHAR(30), 
    PRIMARY KEY (id) 
) ENGINE=MyISAM; 
PARTITION BY RANGE(id) (
    PARTITION p0 VALUES LESS THAN (500000), 
    PARTITION p1 VALUES LESS THAN (1000000), 
    PARTITION p2 VALUES LESS THAN (1500000), 
    PARTITION p3 VALUES LESS THAN (2000000), 
    PARTITION p4 VALUES LESS THAN (2500000)    
) 

У меня есть три вопроса:

1) Я здесь # 1064 ошибка;

2) Как я могу установить split test.user как алфавитный диапазон в разделе;

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

ответ

0

Насколько я знаю, вы не можете разделить раздел на 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 в Первичный ключ.

Надеюсь, что это поможет :)

Смежные вопросы