Mysql ошибка раздела? - PullRequest
       8

Mysql ошибка раздела?

0 голосов
/ 03 марта 2012

У меня есть такая таблица:

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) Как я могу проверить, что раздел был успешным;

1 Ответ

0 голосов
/ 26 марта 2012

Насколько я знаю, вы НЕ МОЖЕТЕ РАЗДЕЛИТЬ раздел на 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 к первичному ключу.

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

...