我正在考虑在我的数据库中添加一些非规范化信息,方法是添加由多(~8)规范化表格提供的一个非规范化表格,专门用于改善选择查询时间我网站上的核心用例。
当前查询方法的问题是:
查询时间慢,有8到12个连接(一些左连接)来访问此用例的信息,对于某些查询,这可能需要~3000ms。
表锁定/阻止,当信息在一天或一周的繁忙时间更新时(因为我正在使用MyIsam表)查询被锁定/阻止,这可能会进一步导致问题(连接耗尽,性能更差)
我正在使用Hibernate(3.5.2),Mysql 5.0(所有MyIsam表)和Java 1.6
我想要一些具体的建议(最好基于具体经验),确切地了解更新非规范化表的最佳方法。
以下是我的想法
我正在寻找:
如果有任何其他信息可以帮助回答这个问题,请告诉我。
干杯。
答案 0 :(得分:1)
我现在已经实现了这一点,所以我想我会分享我所做的事情,我问了一个伙伴谁是dba(格雷格)的一些提示,他的答案基本上推动了我的实施:
无论如何,像“Catcall”暗示使用TRIGGERS(至少在我的情况下)可能不是最好的解决方案。 Greg建议创建两个具有相同模式的非规范化表,然后创建一个VIEW,它将在两个非规范化表之间交替,一个是“活动”而另一个是“非活动”,活动表将是我的网站主动查询的表。应用程序和deactive表可以使用非规范化信息进行更新。
我的应用程序将针对名称保持不变的VIEW运行查询。
这就是它的关键。
一些实现细节(mysql 5.0.n):
我使用存储过程更新信息,然后将View从denorm_table_a切换到denorm_table_b。
需要更新我的数据库用户的权限 GRANT CREATE,CREATE VIEW,EXECUTE,CREATE ROUTINE,ALTER ROUTINE,DROP,INSERT,DELETE,UPDATE,ALTER,SELECT,INDEX on dbname。* to'dbuser'@'%';
用于创建表的副本:CREATE TABLE ... LIKE ....;命令非常有用(它也会复制索引定义)
创建VIEW很简单 创建或替换视图denorm_table AS SELECT * FROM denorm_table_a;
创建或替换视图denorm_table AS SELECT * FROM denorm_table_b;
我在中间层创建了一个特殊的“非规范化查询”对象,然后将其(通过休眠)映射到非规范化表(或实际上是View),并允许通过Hibernate Criteria机制进行简单灵活的查询。
无论如何,如果有人需要更多细节,请帮助我,希望我知道,
干杯 西蒙
答案 1 :(得分:0)
这是我用来使用存储过程和触发器对mysql一对多关系进行非规范化的解决方案:
https://github.com/martintaleski/mysql-denormalization
它解释了一篇关于文章图片关系的简单博客文章,您需要更改字段和查询的字段以将其应用于您的场景。