MySQL разметка и объединения - PullRequest
3 голосов
/ 22 июня 2011

Извините, если это глупый вопрос, но новичок в этом вопросе, поэтому нужна помощь, чтобы понять несколько вещей.В настоящее время я обновляю mysql до 5.1, чтобы я мог использовать разделы в mysql.Мой вопрос: если я разделю таблицу, будет ли разделенная таблица, включая процесс сокращения, по-прежнему работать с запросом с использованием объединения или будет оптимальным разделение, если вы просто запрашиваете таблицу с разделами?* EDIT

Вот пример запроса:

SELECT event.*,site.* FROM event INNER JOIN site ON event.siteid = site.id
WHERE event.eventdate >= [somedate] AND event.eventdate <= [somedate]
AND event.siteid = [siteid]

И у меня есть настройка разделов в таблице событий с использованием поля eventdate.Сможет ли mysql по-прежнему использовать разделы в таблице событий, включая процесс сокращения?

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Разделенные таблицы можно использовать в соединениях.

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

select * from a
inner join partioned_table p on (p.id = a.id)
where p.year = '2011';

Этот запрос будет работать с предложением where и без него, но с предложением where он будет выполняться намного быстрее, поскольку вы обращаетесь только к одному разделу.
Если вы получаете доступ к большему количеству разделов, MySQL должен использовать временную таблицу для соединения разделов, прежде чем он сможет выполнить соединение.
Этот вид поражает назначение разделов.

0 голосов
/ 22 июня 2011

Не уверен, что я хорошо понимаю вопрос, но разбиение не должно влиять на работу ваших объединений.Это просто влияет на способ хранения данных.Движок MySQL позаботится о том, чтобы знать, где можно получить данные, поэтому в действительности вы должны хранить свои объединения именно так, как они у вас есть.Вот пример:

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

select a.* 
from members a, subscriptions b 
where a.email = b.email and b.generation='X' 
  and a.joined between '1980-01-01' and now()

Дайте мне знать, если это имеет смысл!Марсело

...