mad*_*ead 9 mysql performance join
我正在构建两个应用程序,它们将共享一些通用模式中的数据.我正在使用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';
Run Code Online (Sandbox Code Playgroud)
得到我所期待的!这看起来非常酷,因为我正在考虑使用这种设计进行生产.
但我有点害怕这种设计的性能影响?这是一个好主意吗?如果将来我决定在不同的机器上对数据库进行分片(在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
Run Code Online (Sandbox Code Playgroud)
所以我希望用户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
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
MySQL为所有数据库维护一组缓冲区.关于性能,表是否在不同的数据库中并不重要.
您的用例是boderline,但似乎是汇总来自不同数据库的数据的合理案例.
我会小心这个架构.如果您的应用程序开始共享的不仅仅是几个表,请问自己这些应用程序是否真的是不同的应用程序,或者说是同一应用程序的模块.在后一种情况下,将所有表放在一个sigle数据库中是有意义的.
如果您担心安全性,请注意,可以基于每个表(甚至每个列)授予大多数访问权限.
| 归档时间: |
|
| 查看次数: |
6031 次 |
| 最近记录: |