Как я могу использовать MySQL разделение на этой таблице? - PullRequest
0 голосов
/ 02 марта 2011

Я работаю над проектом типа социальной сети, как и в большинстве социальных сетей, пользовательским фидом, который покажет, что ВАШИ друзья сделали на сайте.

Допустим, у меня есть таблица MySQL для этих элементов с этими полями;

// user_actions  
auto_id = auto increment ID  
type = a number (1 = photo upload, 2 = friend added, 3 = status post, 4 = so other action, etc..)  
user_id = The id of the user who did the action  
datetime = date and time  
action_id = this could be the ID of the action, so if it is for a status post, it could be the ID of the actual status  post record  

Теперь в моем PHP-скрипте я бы запросил эту таблицу, чтобы получить все дружеские действия пользователя.

Я думаю, что это идеальный тип таблицы для использования секционирования MySQL, поэтому вместо того, чтобы показывать все действия ваших друзей и запрашивать у него каждое действие, когда-либо опубликованное на сайте, что может быть в миллионах записей, основанных на предыдущий сайт, который я сделал, я думаю, что было бы неплохо разбить до свидания, может быть, все действия разбиты на 6-месячные разделы, так что меньше запросов для запроса.

Я никогда не работал с разделами, но искал решение, подобное этому, в течение нескольких лет, я просто обнаружил встроенные разделы MySQL, и они кажутся нам подходящими.

Может кто-нибудь показать мне, как я мог бы создать такую ​​таблицу в разделах, также, поскольку мне нужно было бы создавать новый раздел каждые 6 месяцев, есть ли способ автоматизации новых разделов? Пожалуйста, помогите

1 Ответ

2 голосов
/ 02 марта 2011

Это не проверено, но должно быть близко.

CREATE TABLE user_actions (
    auto_id         INT NOT NULL AUTO_INCREMENT,
    type            INT NOT NULL,
    user_id         INT NOT NULL,
    insert_datetime DATE NOT NULL,
    action_id       INT NOT NULL) 
PARTITION BY RANGE(TO_DAYS(insert_datetime))
(
    PARTITION p0  VALUES LESS THAN (to_days('2011-06-01')),
    PARTITION p1  VALUES LESS THAN (to_days('2012-01-01')) ,
    PARTITION p11 VALUES LESS THAN MAXVALUE 
);

Вы можете управлять этим следующим образом:

Вы можете иметь раздел MAXVALUE, всегда представляющий ваш "активный" (вваш случай текущий 6-месячный период) раздел.Когда период истек, вы можете разделить / перегруппировать тот раздел MAXVALUE, где прошедший период переходит в новый раздел, причем раздел MAXVALUE снова представляет текущий / активный раздел.

Например, 1 января 2011 года у вас будет один раздел, назовем его pM, и он будет хранить все, как в предложении LESS THAN MAXVALUE.Затем, по прошествии 6 месяцев, вы перегруппируете / разделите этот единственный раздел, создав новый раздел, содержащий все данные за предыдущие 6 месяцев, и раздел MAXVALUE, снова представляющий текущий / активный период.

-- Untested, but again should be close
ALTER TABLE t1 REORGANIZE PARTITION (pM) INTO
(PARTITION p20110101 VALUES LESS THAN (to_days('2011-07-01'), 
 PARTITION pM VALUES LESS THAN MAXVALUE); 

Вы можете также рассмотреть подразделение.Вы можете подразделить свой user_id на HASH и, следовательно, еще больше снизить количество операций ввода-вывода и затраты на запросы данных на основе user_id.

Проверьте следующие ссылки для получения дополнительной информации о разделении.

MySQL Partitioning

Управление разделами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...