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