2015-05-19 7 views
1

У меня есть таблица с таблицей с PARTITION BY KEY PARTITIONS 10;Mysql Parition Change from Key to Hash

Create Table: CREATE TABLE `table1 (
    `id` varchar(36) NOT NULL DEFAULT '', 
    `ref_id` varchar(32) NOT NULL DEFAULT '', 
    `target` varchar(50) DEFAULT NULL, 
    `source` varchar(60) DEFAULT NULL, 
    `t_time` DATETIME DEFAULT NULL, 
    PRIMARY KEY (`id`,`ref_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
/*!50100 PARTITION BY KEY (`id`,`ref_id`) 
PARTITIONS 10 */ 

Я хочу изменить этот раздел на РАЗДЕЛЕНИЕ ХАРАКТЕРИСТИКАМИ 20; Но не уверен, как сменить ключ на хеширование без потери данных.

Пожалуйста, помогите

ответ

0

Ни один метод разметки не является полезным; Я рекомендую удалить секционирование. При этом вы, вероятно, должны удалить ref_id с PRIMARY KEY.

Если у вас есть основания полагать, что разделение помогает в некотором роде, я хотел бы продолжить дискуссию.

Пахнет id UUID или GUID. Если производительность является основным вопросом, я рекомендую вам сжать таблицу с помощью BINARY (16); см. my uuid blog для кода для преобразования. (Меньше -> быстрее)

Редактировать (Аргумент против Перегородки в данном случае)

Распространенным заблуждением является то, что разрыв таблицы на более мелкие куски улучшит производительность. Давайте проанализируем, например, «точечный запрос», такой как SELECT, где вы указываете одну строку через PRIMARY KEY.

В таблице без разбивки будет развернута строка, чтобы найти строку. Если таблица имеет несколько миллиардов строк, то уровень BTree будет примерно на 5 уровней. Таким образом, для поиска фактической строки потребуется найти около 5 блоков индекса.

В эквивалентной разделенной таблице каждый раздел похож на меньшую таблицу. Точечный запрос должен будет (1) найти нужный раздел, затем (2) развернуть, возможно, 4 уровня в BTree в этом разделе. Это 1 + 4 операции - вероятно, примерно такая же скорость, что и 5 в таблице без разделов.

Заключение: Точечный запрос не использует раздел.

Есть другие типы запросов, которые может извлечь выгоду из раздела. Например, если все запросы были нацелены на раздел, этот раздел может быть лучше кэширован. Но это «не может» произойти здесь. Таблица разделена на UUID (я предполагаю), такой как очень случайный, так что вы не можете смотреть только на один раздел.

Если вы захотите поделиться общими запросами, я мог бы дополнительно уточнить, какие из них (или нет) извлекают из этой (или другой) формы раздела.

+0

Привет, Рик. В основном все мои запросы основаны на id, ref_id, поэтому ref_id в первичном ключе очень нужен для поиска. Кроме того, этот Table Host занимает около 1,8 миллиарда записей. Вот почему я думаю, что раздел поможет разбить таблицу небольшими кусками. Ваши комментарии по этому поводу. – user3752021