MySQL 中多个模式之间的交叉连接。特权和性能
Posted
技术标签:
【中文标题】MySQL 中多个模式之间的交叉连接。特权和性能【英文标题】:Cross join between multiple schemas in MySQL. Privileges and performance 【发布时间】:2013-11-27 23:54:51 【问题描述】:我正在构建两个应用程序,它们将以通用模式共享一些数据。我使用 mysql 作为 RDBMS。这是我的第一个架构 (test_schema_1
):
第二个(test_schema_2
):
我最近了解到我可以在多个模式之间进行 JOIN。当我与 root 用户连接时(无限制访问所有内容),我会这样做:
SELECT * FROM
TEST_SCHEMA_2.USERS U
JOIN TEST_SCHEMA_1.MASTER_USERS MU ON U.MASTER_ID = MU.ID
JOIN TEST_SCHEMA_2.ROLES R ON U.ROLE_ID = R.ID
WHERE MU.APP_ID = 'darth_vader@death.star';
得到我所期望的!这对我来说看起来很酷,因为我正在考虑使用这种设计进行生产。
但我有点害怕这种设计对性能的影响?这是一个好主意吗?如果将来我决定在不同的机器上对数据库进行分片(用 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_schema_2
。但是上面的查询有效。他甚至可以插入test_schema_2
:
SELECT USER();
INSERT INTO TEST_SCHEMA_2.ROLES(ID, NAME) VALUES(4, 'TEST');
...
USER()
t1@localhost
-------------------------------------------
Updated Rows
1
我错过了什么?
【问题讨论】:
你能把SELECT CURRENT_USER()
的返回值贴出来吗? (而不是你的测试用例中的SELECT USER()
)
【参考方案1】:
MySQL 为所有数据库维护一组缓冲区。在性能方面,表是否在不同的数据库中并不重要。
您的用例是边界线,但似乎是从不同数据库聚合数据的合理案例。
不过,我会小心使用这种架构。如果您的应用程序开始共享多个表,请问问自己这些应用程序是否真的是不同的应用程序,或者更确切地说是同一应用程序的模块。在后一种情况下,将所有表放在一个数据库中对我来说是有意义的。
如果您担心安全问题,请注意大多数访问权限可能会授予on a per-table (or even per-column) basis。
【讨论】:
您的t1
用户不应有权访问test_schema_2
。我怀疑你被认证为不同的用户,我会在你回复我之前的评论后立即更新。
感谢您的回答。 SELECT CURRENT_USER();
返回t1@localhost
。我可以在同一个会话中查询test_schema_2
。
@madhead Michael 的建议可能通过重置用户的访问权限来解决您的问题。如果没有,请检查SHOW GRANTS FOR [user]@localhost
的输出(现在我想知道您的Db
列来自哪里,我的mysql.user
表中没有这样的列)
这里是赠款:GRANT USAGE ON *.* TO 't1'@'localhost' IDENTIFIED BY PASSWORD '*42E2A0844F38FD79D5685D95FC39BF6AA39A21C3' GRANT SELECT, INSERT, UPDATE, DELETE, TRIGGER ON
test_schema_1.* TO 't1'@'localhost'
请注意,如果您使用 InnoDB,则外键的跨数据库限制不适用;您可以愉快地创建外键引用同一服务器上另一个数据库中的表。见***.com/questions/3905013/…【参考方案2】:
首先,您应该调整安全设置。您的用户可能已授予对所有模式的访问权限。 为简单起见,请尝试调用以下命令:
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 中多个模式之间的交叉连接。特权和性能的主要内容,如果未能解决你的问题,请参考以下文章