2017-02-17 2 views
0

У меня есть элементы таблицы. 18 млн записей:Разбиение по данным mysql

CREATE TABLE IF NOT EXISTS `items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `log_id` int(11) NOT NULL, 
    `res_id` int(11) NOT NULL, 
    `link` varchar(255) NOT NULL, 
    `title` text NOT NULL, 
    `content` text NOT NULL, 
    `n_date` varchar(255) NOT NULL, 
    `nd_date` int(11) NOT NULL, 
    `s_date` int(11) NOT NULL, 
    `not_date` date NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `link_2` (`link`), 
    KEY `log_id` (`log_id`), 
    KEY `res_id` (`res_id`), 
    KEY `now_date` (`not_date`), 
    KEY `sql_index` (`res_id`,`id`,`not_date`) 
) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=0 AUTO_INCREMENT=18382133 ; 

Попытка разделить эту таблицу я создал мини-копию и включают в себя столбец «not_date» в первичных и Uniq ключей:

CREATE TABLE IF NOT EXISTS `part_items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `log_id` int(11) NOT NULL, 
    `res_id` int(11) NOT NULL, 
    `link` varchar(255) NOT NULL, 
    `title` text NOT NULL, 
    `content` text NOT NULL, 
    `n_date` varchar(255) NOT NULL, 
    `nd_date` int(11) NOT NULL, 
    `s_date` int(11) NOT NULL, 
    `not_date` date NOT NULL, 
    PRIMARY KEY (`not_date`,`id`), 
    UNIQUE KEY `link_2` (`not_date`,`link`), 
    KEY `log_id` (`log_id`), 
    KEY `res_id` (`res_id`), 
    KEY `now_date` (`not_date`), 
    KEY `sql_index` (`res_id`,`id`,`not_date`) 
) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=0 
/*!50100 PARTITION BY RANGE (TO_DAYS(not_date)) 
(PARTITION p_1 VALUES LESS THAN (735963) ENGINE = Aria, 
PARTITION p_2 VALUES LESS THAN (736694) ENGINE = Aria) */ AUTO_INCREMENT=18414661 ; 

Тогда я бегу sql_query:

alter table `part_items` PARTITION BY RANGE(TO_DAYS(not_date)) (
PARTITION p_1 VALUES LESS THAN(TO_DAYS('2014-12-31')), 
PARTITION p_2 VALUES LESS THAN(TO_DAYS('2016-12-31')) 
); 

Затем я пытаюсь выбрать записи, которые должны де-в p_1 и объяснить разделы, показывают, что поиск был только в p_1. Но когда я выбираю записи, которые должны быть в p_2, объясните, что разделы показывают full-scan (p_1, p_2). Что не так в моем коде? запросов:

explain partitions SELECT * FROM `part_items` where content like '%k%' and not_date < '2014-05-12' 

explain partitions SELECT * FROM `part_items` where content like '%k%' and not_date > '2015-01-01' 

И еще один вопрос: можно ли секционирования взгляды? enter image description here

+0

добавить объясните вывод пожалуйста – e4c5

+0

У меня есть вопрос редактирования, там объяснение output – Baurzhan

+0

Может ли кто-нибудь мне помочь? – Baurzhan

ответ

0

Когда PARTITIONing по какой-либо функции даты, существует вероятность наличия недопустимой даты. Это приведет к NULL; такие значения сохраняются в первой секции .

Это проблема, из-за которой многие разработчики. Типичным «обходным путем» является то, что первый раздел пуст, так что попытка поиска в нем (как правило) минимальна. В вашем случае:

PARTITION p_0 VALUES LESS THAN(0) 

Разделение менее чем на 6 разделов обычно не стоит усилий; будете ли вы добавлять дополнительные разделы?

(Оговорка:.. Мой совет приходит с лет MyISAM/InnoDB секционирования, я не знаю Aria работает иначе, я подозреваю, что секционирование основном обрабатывается в том Engine независимого слоя)

+0

Рик Джеймс, большое спасибо! Добавление PARTITION p_0 ЗНАЧЕНИЕ МЕНЬШЕ (0) реально помогите мне! – Baurzhan

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