#mysql #join #federated-table
#mysql #Присоединиться #федеративная таблица
Вопрос:
Я хочу объединить таблицу с представлением, где одна таблица L
является локальной, тогда как представление F
— FEDERATED
это представление, находящееся на другом сервере:
SELECT * FROM L LEFT JOIN F ON L.id = F.id;
Теперь соединение не приводит к совпадениям, несмотря на то, что на самом деле существует много совпадений между таблицей и представлением. Поле ID равно bigint
.
Разочарованный, я создал TEMPORARY
таблицу T
и сбросил все из F
нее, создав таким образом локальную копию F
. Используя T
вместо F
, СОЕДИНЕНИЕ работает так, как ожидалось. Но процесс создания T
потребляет память и время.
Каковы могут быть возможные причины такого странного поведения MySQL?
Определения таблиц:
CREATE TABLE `L` (
`id` bigint(20) NOT NULL,
`id2` bigint(20) NOT NULL,
PRIMARY KEY (`id`,`id2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
и (эта таблица фактически является представлением на удаленном сервере):
CREATE TABLE `F` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`field1` bigint(20) NOT NULL,
...
`field5` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://userName:pword...';
Комментарии:
1. Используете ли вы MySQL NDB? Каков контекст?
2. @AlmaDo: таблицы InnoDB. Локальный сервер — 5.1.54-1ubuntu4, федеративный сервер — 5.5.35-0ubuntu0.12.04.2.
3. Пожалуйста, добавьте определения ваших таблиц
4. @AlmaDo: Теперь я думаю, что знаю, что вызвало проблему. Объединенная таблица на самом деле была представлением. По-видимому, объединения в федеративных представлениях не работают. Прошу прощения, что не обнаружил раньше. Спасибо за вашу помощь, это помогло мне лучше разобраться в этом вопросе.
5. С
federated
движком у вас должен быть table DDL на обоих серверах — так что — да, ПРЕДСТАВЛЕНИЕ не применимо
Ответ №1:
Как указано в определении того, что FEDERATED
такое механизм хранения, у вас должно быть определение структуры таблицы (например .frm
, файлы для MyISAM) на обоих серверах. Это потому, что так FEDERATED
работает движок:
Поэтому вы не можете использовать VIEW
, поскольку оно имеет совершенно другой смысл и структуру. Поэтому вместо этого вы должны зеркально отобразить свою таблицу, и тогда вы сможете использовать ее в своих запросах.