Mysql实现跨库join查询

mysql的跨库查询,我认为有两种情况,一是同一实例下的跨库查询,二是不同实例下的跨库查询,下面我们分别来说。

1、同一实例下的跨库查询

同一实例下的跨库查询,实现起来非常简单,直接在sql中的表前面加上schema的名称就行。

SELECT * FROM 数据库名1.表名 JOIN 数据库名2.表名 ON 数据库名1.表名.tid = 数据库名2.表名.tid;
2、不同实例下的跨库查询

我们重点来说说不同实例下的跨库查询实现方式。最优先考虑的是使用federated引擎。

我们在mysql数据库中常见的存储引擎有MyISAM, InnoDB等等。通过使用以下命令查看数据库所支持的存储引擎:

show engines; 

可以看到,默认federated引擎是关闭的,需要我们手动的去mysql的配置文件my.ini中去开启它。

开启的方法就是在my.ini文件最末尾加上一行:

federated 

然后重启mysql,就生效了。

接下来,我们需要在开启federated引擎的这个库中新建链接表,对于链接表有如下几个要求:

1.本地的表结构必须与远程的完全一样
2.远程数据库目前仅限MySQL
3.不支持事务
4.不支持表结构修改

我们可以通过导出表结构,然后做一定修改的方式来新建链接表,免得自己手工去拼装sql。我们需要注意的是要把导出来的建表语句中指定存储引擎的地方改一下:

ENGINE=FEDERATED
CONNECTION='mysql://ip:[name]:[pass]@[location]:[port]/[db-name]/test'

例如下方这个建表语句例子

CREATE
TABLE test (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
username varchar(60) NOT NULL DEFAULT '' COMMENT '帐号',
reg_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
PRIMARY KEY (id)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
CONNECTION='mysql://ip:[name]:[pass]@[location]:[port]/[db-name]/test'
COMMENT='链接表';

这样,我们就把另外一个库的表链接到我们现在操作的这个库上了,我们就可以在sql中直接join这个表了。

发表评论

邮箱地址不会被公开。 必填项已用*标注