Многостоловые запросы MySQL - PullRequest
0 голосов
/ 05 марта 2010

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

Например.

data_01_2010 holds data from 2010-01-01 to 2010-01-31
data_02_2010 holds data from 2010-02-01 to 2010-02-28

Иногда мне приходится запрашивать эти таблицы в соответствии с конкретным диапазоном дат.Теперь, если диапазон составляет несколько месяцев, напримерС 2010-01-01 по 2010-02-28 затем мне нужно запросить обе таблицы.

Можно ли это сделать одним запросом?Как например:

SELECT * 
FROM data_01_2010, data_02_2010 
WHERE date BETWEEN '2010-01-01' AND '2010-02-28'

Проблема с вышеупомянутым запросом состоит в том, что он говорит, что дата столбца является неоднозначной, потому что столбец присутствует в обеих таблицах.(таблицы имеют одинаковую структуру)

Значит, это достижимо с помощью одного запроса или мне нужно запрашивать его для каждой таблицы отдельно?

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

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

В этом примере у вас будет одна таблица с именем data (надеюсь, вы бы назвали ее лучше, чем эта) и разберете ее на части по значению столбца date (опять же, надеюсь, вы бы назвали этот столбец лучше) , Это означает, что вы можете удовлетворить ваши требования простым выбором:

SELECT * FROM data WHERE date BETWEEN '2010-01-01' AND '2010-02-28';

Под прикрытием база данных будет иметь доступ только к требуемым разделам на основе предложения where.

Ссылка: http://dev.mysql.com/doc/refman/5.5/en/partitioning.html

0 голосов
/ 05 марта 2010

Если вы выполняете логику в другом месте, чтобы выяснить, какие таблицы нужно запрашивать, и каждый месяц имеет одну и ту же схему, вы можете просто объединить таблицы:

SELECT *
FROM data_01_2010
WHERE date BETWEEN '2010-01-01' AND '2010-02-28'
UNION ALL
SELECT *
FROM data_02_2010
WHERE date BETWEEN '2010-01-01' AND '2010-02-28'

Но если вам нужен запрос для вычисления таблиц, которые нужно объединить, вы рискуете войти в область хранимых процедур.

...