2011-12-27 40 views
0

我正在考虑加入一个许多(〜8)规范化的表非规范化的饲喂表上添加我的数据库中一些非规范化的信息,专门用于提高核心使用select查询时间在我的网站上的情况。MySQL的非规范化与触发器,具体咨询

与查询当前方法的问题是:

  1. 慢速查询时间,有8和12之间的连接(一些左的连接)来访问此信息,使用情况下,该对于某些查询可能需要〜3000ms。

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

我使用Hibernate(3.5.2),MySQL 5.0中(所有的MyISAM表)和Java 1.6

我想一些具体的建议(最好是基于具体经验)约到底什么才是更新非规格化表的最好方法。

下面,我想起

  1. 创建与INNODB型非规范化表,让我得到级锁,而不是表锁
  2. 在正确规范化表创建触发器更新反规格表

我在寻找:

  1. 问题 - 我可能没有想到的事情会影响我期望的结果。
  2. 特定的MySql设置可以提高性能,减少非规格化表上的锁定/阻塞。
  3. 为此场景编写触发器的最佳方法。

让我知道是否有任何其他信息需要帮助回答这个问题。

干杯。

+0

非规范化的数据是否严格数字?非规范化操作是否严格代数? – 2011-12-27 15:48:22

+0

你在说多少数据? 10行? 10M行?你可能会更好地服务于更多/更好/覆盖索引。查询是静态的吗?您也可以预先缓存它。 '解释器'对你的查询说了什么? – ethrbunny 2011-12-27 15:55:38

+0

操作都是代数(我认为),没有像字符串比较或全文字符串搜索 – 2011-12-27 16:10:01

回答

1

我现在已经实现了这个,所以我想我会分享我做什么,我问一个伴侣谁是一名DBA(格雷格)的一些技巧和他的回答基本上都是开着我的实现:

反正像使用TRIGGERS(至少在我的情况下)暗示使用“Catcall”可能不是最好的解决方案。 Greg建议创建两个具有相同模式的非规范化表,然后创建一个VIEW,它将在两个非规范化表之间交替,一个是“活动”,另一个是“禁用”活动表是我的web正在主动查询的表应用程序和deactive表可以使用非规范化信息进行更新。

我的应用程序将运行查询,其名称将保持不变。

这就是它的关键所在。

一些实施细则(MySQL的5.0.n):

我用存储过程来更新信息,然后切换视图从denorm_table_a到denorm_table_b。

需要更新 授予create为我的数据库用户的权限,CREATE VIEW,执行,创建常规,ALTER常规,DROP,INSERT,DELETE,UPDATE,ALTER,SELECT,指数DBNAME。* TO 'dbuser的' @ '%';

用于创建表的副本:CREATE TABLE ... LIKE ....;命令非常有用(它也复制索引定义)

创建VIEW很简单 CREATE OR REPLACE VIEW denorm_table AS SELECT * FROM denorm_table_a;

CREATE OR REPLACE VIEW denorm_table AS SELECT * FROM denorm_table_b;

我在中间层创建了一个特殊的“非规范化查询”对象,然后通过hibernate映射到非规范化表(或事实上的View),并允许通过Hibernate Criteria机制轻松而灵活地查询。

反正希望帮助的人,如果有人需要更多的细节让我知道,

干杯 西蒙

+0

请问为什么你决定反对触发器?我是否理解正确,你a)总是在b)重定向视图之前重建完整的表,c)保持查询表只读? – sfussenegger 2012-07-03 13:10:39

+0

@sfussenegger我决定不使用触发器,因为它们会经常触发并锁定denorm表(我使用myisam表),基本上在denorm表上发射了太多的写入操作。问候你的其他要点a)是的,b)是的c)是的 – 2014-11-21 10:48:04