带触发器的mysql非规范化,具体建议

时间:2011-12-27 15:42:30

标签: mysql triggers innodb myisam denormalization

我正在考虑在我的数据库中添加一些非规范化信息,方法是添加由多(~8)规范化表格提供的一个非规范化表格,专门用于改善选择查询时间我网站上的核心用例。

当前查询方法的问题是:

  1. 查询时间慢,有8到12个连接(一些左连接)来访问此用例的信息,对于某些查询,这可能需要~3000ms。

  2. 表锁定/阻止,当信息在一天或一周的繁忙时间更新时(因为我正在使用MyIsam表)查询被锁定/阻止,这可能会进一步导致问题(连接耗尽,性能更差)

  3. 我正在使用Hibernate(3.5.2),Mysql 5.0(所有MyIsam表)和Java 1.6

    我想要一些具体的建议(最好基于具体经验),确切地了解更新非规范化表的最佳方法。

    以下是我的想法

    1. 使用 InnoDb 类型创建非规范化表格,以便我获得级锁定而不是表锁定
    2. 在更新非规范化表
    3. 的正确规范化表上创建触发器

      我正在寻找:

      1. 陷阱 - 我可能没想到的事情会影响我想要的结果。
      2. 特定的MySql设置,可以提高性能,减少非规范化表上的锁定/阻塞。
      3. 为此方案编写触发器的最佳方法。
      4. 如果有任何其他信息可以帮助回答这个问题,请告诉我。

        干杯。

2 个答案:

答案 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

它解释了一篇关于文章图片关系的简单博客文章,您需要更改字段和查询的字段以将其应用于您的场景。