2011-12-27 44 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