mysql – NOT使用外键的性能影响(许多专用1:许多密钥表与非fk通用密钥表)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – NOT使用外键的性能影响(许多专用1:许多密钥表与非fk通用密钥表),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2904字,纯文字阅读大概需要5分钟。
内容图文
![mysql – NOT使用外键的性能影响(许多专用1:许多密钥表与非fk通用密钥表)](/upload/InfoBanner/zyjiaocheng/896/0cd1fd5cca5c433bbbc35bd8a913d674.jpg)
我们使用了很多关联表来管理1:我们系统中各种不同对象之间的许多关系.
为了说明这个问题,两个例子是:
>用户,事件,ass_users_events. ass_users_events仅包含具有外键关系的User_ID和Event_ID列.
>项目,任务,ass_projects_tasks. ass_projects_tasks将仅包含具有外键关系的Project_ID和Task_ID列.
NB1:每个对象表实际上使用自动递增整数主键的组合,以及具有唯一索引的UUID列,该索引是实际记录ID.出于这个问题的目的,我们只使用UUID,因此没有碰撞的可能性.
NB2:我们使用这种格式而不是直接的外键列/索引的原因是现实比这个例子复杂得多,许多不同的表有许多不同的连接,我们不希望ORM做很多事情每次加载记录时都会进行不必要的工作
问题是我们开始为系统中的许多其他现有对象创建系统中几乎所有新对象类型的这些关联表,从长远来看这似乎不可持续,我们最终会数百种关联类型.
我们正在考虑的一个潜在解决方案是删除所有当前的关联表,而是创建一个具有以下结构的表:obj_1_id,obj_1_type,obj_2_id,obj_2_type.每个列都将被索引,可能作为复合索引(即INDEX object_1(obj_1_type,obj_1_id)和INDEX object_2(obj_2_type,obj_2_id)).
ass表中的上述示例将变为:abc,user,123,event和def,project,456,task.
这个解决方案使我们可以灵活地在不同的对象之间构建尽可能多的关系类型,并且在ass表上有足够的索引来保持高性能.我的问题是,仅在连接期间使用索引是否存在缺点,而在较小的表中定义了外键关系,但可能有数百个?
编辑:我认为下面有一些误解,所以这可能会清除一些事情:
>我使用多态对象结构,但每个对象都存储在自己的表中,即用户,产品,类别,事件等.
>就拟议的ass表而言,它只有4个功能字段,具有非常简单的数据类型(加上一个ai_col作为主要数据类型).对于类型cols,数据类型为varchar(10),对于id,数据类型为CHAR(32)/ BINARY(16). SELECT只会有一个连接到ass表,即
SELECT事件.* FROM事件INNER JOIN ass ON ass.obj_1_type =’event’AND ass.Object_ID_1 = event.Event_ID AND ass.obj_2_type =’location’
没有理由我会一次要求这些对象中的两个,我只会通过存在ass链接从一个表中过滤结果.
> UUID是真正的唯一ID,但是每个表都使用ai_col,这是一个INNODB构造,用于提高其聚簇索引的性能.
>这是一个读取繁重的环境,我并不关心插入/删除性能.
>我们使用handlersocket进行简单的读写查询,以消除SQL开销.
>此表的完整性在此特定用例的最终一致性中是可接受的.
编辑2:为了使这个结晶清晰,这就是为什么…如果我在他们自己的表中各有200个对象,我希望能够以所有可能的方式链接,我要么必须有199个外键关系每个对象表,或者我必须创建40,000个具有所有可能组合的表,然后是所有业务逻辑.使用我们正在考虑的方法,有一个表,我在应用程序级别处理了RI,我指出它最终是一致的.
解决方法:
不使用外键不会对性能产生影响.外键约束通过约束可插入外键列的值来简单地强制引用完整性.
如果您使用UUIDS作为标识符,为什么需要关联表中的类型列?
正如您所提到的那样,以传统方式进行建模会导致大量表格.例如,删除用户将导致RDBMS检查每个外键约束以确保违反,这可能需要一些时间!使用您提出的方法,RDBMS将不会检查外键约束,并且将更快地删除用户.因此,您实际上可以更好地删除对象.正如您所指出的那样,您必须拥有一个后台作业,使关联表最终保持一致.对此,您可以考虑保留已删除对象的日志并将其重新映射到关联表.这比在每一行上执行存在检查以查看引用的对象是否仍然存在更好.
我已经使用这种方法已经好几年了,它可以让任何东西与其他东西相关并且没有遇到任何问题.
内容总结
以上是互联网集市为您收集整理的mysql – NOT使用外键的性能影响(许多专用1:许多密钥表与非fk通用密钥表)全部内容,希望文章能够帮你解决mysql – NOT使用外键的性能影响(许多专用1:许多密钥表与非fk通用密钥表)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。