MySQL中多个模式之间的交叉连接。特权和性能

MySQL中多个模式之间的交叉连接。特权和性能,mysql,performance,join,Mysql,Performance,Join,我正在构建两个应用程序,它们将在公共模式中共享一些数据。我使用MySQL作为RDBMS。这是我的第一个模式(test\u schema\u 1): 第二个(测试模式2): 我最近了解到,我可以在多个模式之间进行连接。当我与root用户连接(无限制地访问所有内容)时,我会: 得到我所期望的!这对我来说很酷,因为我正在考虑用这种设计投入生产 但我有点担心这种设计对性能的影响?这是个好主意吗?如果将来我决定(用MongoDB术语)在不同的机器上共享数据库会怎么样 另外,我想知道安全问题。目前,每个

我正在构建两个应用程序,它们将在公共模式中共享一些数据。我使用MySQL作为RDBMS。这是我的第一个模式(
test\u schema\u 1
):

第二个(
测试模式2
):

我最近了解到,我可以在多个模式之间进行连接。当我与root用户连接(无限制地访问所有内容)时,我会:

得到我所期望的!这对我来说很酷,因为我正在考虑用这种设计投入生产

但我有点担心这种设计对性能的影响?这是个好主意吗?如果将来我决定(用MongoDB术语)在不同的机器上共享数据库会怎么样

另外,我想知道安全问题。目前,每个模式都有一个单独的用户:

Host        Db              User    Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv   Grant_priv  References_priv Index_priv  Alter_priv  Create_tmp_table_priv   Lock_tables_priv    Create_view_priv    Show_view_priv  Create_routine_priv Alter_routine_priv  Execute_priv    Event_priv  Trigger_priv
%           test_schema_1   t1      Y           Y           Y           Y           N           N           N           N               N           N           N                       N                   N                   N               N                   N                   N               N           Y
localhost   test_schema_1   t1      Y           Y           Y           Y           N           N           N           N               N           N           N                       N                   N                   N               N                   N                   N               N           Y
%           test_schema_2   t2      Y           Y           Y           Y           N           N           N           N               N           N           N                       N                   N                   N               N                   N                   N               N           Y
localhost   test_schema_2   t2      Y           Y           Y           Y           N           N           N           N               N           N           N                       N                   N                   N               N                   N                   N               N           Y
因此,我希望用户
t1
无法读取
test\u schema\u 2
。但是上面的查询是有效的。他甚至可以在
测试模式2
中插入:

SELECT USER();
INSERT INTO TEST_SCHEMA_2.ROLES(ID, NAME) VALUES(4, 'TEST');
...
USER()
t1@localhost
-------------------------------------------
Updated Rows
1

我缺少什么?

首先,你应该调整安全设置。您的用户可能已授予对所有模式的访问权限。 为了保持简单,请尝试调用以下命令:

REVOKE ALL PRIVILEGES, GRANT OPTION from 't1','t2'; 
GRANT SELECT, INSERT, UPDATE, DELETE ON `test\_schema\_1`.* TO 't1';
GRANT SELECT, INSERT, UPDATE, DELETE ON `test\_schema\_2`.* TO 't2';
FLUSH PRIVILEGES;

第二部分是关于模式的。基本上,查询不同的模式不是问题。如果您对安全问题感到困惑,我建议您将查询切换到过程。至于切分,分解不同的模式就更不复杂了

MySQL为所有数据库维护一组缓冲区。至于性能,表是否在不同的数据库中并不重要

您的用例是boderline,但似乎是从单独的数据库聚合数据的合理案例

不过,我会小心使用这种架构。如果您的应用程序开始共享多个表,请自问这些应用程序是真正不同的应用程序,还是同一应用程序的模块。在后一种情况下,将所有表放在一个单一数据库中对我来说是有意义的


如果您担心安全问题,请注意,大多数访问权限可能会被授予

您能否发布
选择当前用户()的返回值
?(而不是在测试用例中选择用户()
)您的
t1
用户不应该有权访问
test\u schema\u 2
。我怀疑你被认证为不同的用户,我会在你回复我之前的评论后立即更新。谢谢你的回答<代码>选择当前用户()返回
t1@localhost
。我可以在同一个会话中查询
test\u schema\u 2
。@madhead Michael的建议可能通过重置用户的访问权限解决了您的问题。如果没有,请检查[user]@localhost
SHOW GRANTS的输出(现在我想知道您的
Db
列来自哪里,我在我的
mysql.user
表中没有这样的列。这里的user
表)以下是授权:
将*.t1上的使用权授予通过密码“*42e2a0844f38fd79d5685d95fc39bf6aa39a2c3”标识的“t1”@“localhost”,插入、更新、删除、触发
test_schema_1
*到't1'@'localhost'
注意,如果使用InnoDB,外键的跨数据库限制不适用;您可以愉快地在同一服务器上的另一个数据库中创建引用表的外键。谢谢你的回答,但另一个更详细。
REVOKE ALL PRIVILEGES, GRANT OPTION from 't1','t2'; 
GRANT SELECT, INSERT, UPDATE, DELETE ON `test\_schema\_1`.* TO 't1';
GRANT SELECT, INSERT, UPDATE, DELETE ON `test\_schema\_2`.* TO 't2';
FLUSH PRIVILEGES;