MySQL-Federated引擎

       FEDERATED存储引擎访问在远程数据库的表中的数据,而不是本地的表。这个特性给某些开发应用带来了便利,你可以直接在本地构建一个federated表来连接远程数据表,配置好了之后本地表的数据可以直接跟远程数据表同步。实际上这个引擎里面是不真实存放数据的,所需要的数据都是连接到其他MySQL服务器上获取。

开启federated引擎 

进入mysql命令行,没有看到Federated,说明没有安装

mysql>show engines;

以上说明federated已经安装但是并没有开启,加入没有安装可按一下方式安装:

安装Federated

mysql> install plugin federated soname 'ha_federated.so';

开启federated

在my.cnf中加入一行federated,保存并退出,然后重新启动MySQL

创建fedearted表

使用FEDERATED建表语句如下: 

CREATE TABLE (......) ENGINE =FEDERATED CONNECTION='mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]' 

name--mysql用户名

pass--mysql密码

location--ip

port:端口号

db-name:数据库名

table-name:表名

 PS:创建的表名和远程访问的表名可以不同。

注意事项

1.对本地虚拟表的结构修改,并不会修改远程表的结构 
2.truncate 命令,会清除远程表数据 
3. drop命令只会删除虚拟表,并不会删除远程表

4.  不支持 alter table 命令

目前使用federated 最大的缺点: 
1. select count(*), select * from limit M, N 等语句执行效率非常低,数据量较大时存在很严重的问题,但是按主键或索引列查询,则很快,如以下查询就非常慢(假设 id 为主索引) 
select id from db.tablea where id >100 limit 10 ;

而以下查询就很快: 
select id from db.tablea where id >100 and id<150

2.  如果虚拟虚拟表中字段未建立索引,而实体表中为此字段建立了索引,此种情况下,性能也相当差。但是当给虚拟表建立索引后,性能恢复正常。

3. 类似 where name like "str%" limit 1 的查询,即使在 name 列上创建了索引,也会导致查询过慢,是因为

federated引擎会将所有满足条件的记录读取到本,再进行 limit 处理。

这几个问题已经严重影响了federated 在实际环境中的应用,所以这个引擎很冷门,不过在一些特定环境还是能用的。

猜你喜欢

转载自blog.csdn.net/commasx/article/details/87284878