一 物化視圖
物化視圖,它是用于預(yù)先計(jì)算并保存表連接或聚集等耗時(shí)較多的操作的結(jié)果,這樣,在執(zhí)行查詢時(shí),就可以避免進(jìn)行這些耗時(shí)的操作,而從快速的得到結(jié)果。
只有大型數(shù)據(jù)庫oracle10g,db2才支持這個(gè)功能,而MySQL5.1暫時(shí)還沒有這個(gè)功能。本人通過事件調(diào)度和存儲(chǔ)過程模擬了物化視圖。下面大家一起來討論吧。^-^
二 準(zhǔn)備知識(shí)
1)存儲(chǔ)過程:玩過數(shù)據(jù)庫的人,都知道他是啥~,~
2)事件調(diào)度:在MySQL5.1開始才有的新功能。說白了就是個(gè)定時(shí)器。跟java里的timer差不多。
show processlist; --這個(gè)命令能是查看線程,如果啟動(dòng)了時(shí)間調(diào)度器,則會(huì)多個(gè)event_schedulerset global event_scheduler = on; --啟動(dòng)時(shí)間調(diào)度器,關(guān)閉就不用我說了吧,off就可以了show processlist\G;--查看線程,是不是多了個(gè) User: event_scheduler--如果想啟動(dòng)單個(gè)事件,則執(zhí)行下面命令A(yù)LTER EVENT `myEvent`ON COMPLETION PRESERVEENABLE;--關(guān)閉ALTER EVENT `myEvent`ON COMPLETION PRESERVEDISABLE;
mysql默認(rèn)不會(huì)啟動(dòng)event,所以需要修改你的my.ini或my.cnf[mysqld]的下面加入如下行
event_scheduler=1
三 模擬物化視圖
1)先建個(gè)基表吧。
CREATE TABLE `user` (`Id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`Id`));
2)設(shè)計(jì)視圖
我想查詢所有18歲員工的數(shù)量。
很簡(jiǎn)單,select count(*) from user where age=18;
如果是傳統(tǒng)概念的視圖,在MySQL中,每次訪問視圖的時(shí)候,他都會(huì)創(chuàng)建個(gè)臨時(shí)表,然后執(zhí)行一次。在海量數(shù)據(jù)的情況下,這樣的效率是非常低的。而物化視圖,則他會(huì)定時(shí)去刷新這個(gè)臨時(shí)表,而不是你在用的時(shí)候才會(huì)去刷新。并且物化視圖的"臨時(shí)表"是一直存在的。所以效率高出非常多。拿空間換時(shí)間^-^
3)創(chuàng)建"物化視圖"的表
CREATE TABLE `user_view` (`Id` int(11) NOT NULL AUTO_INCREMENT,`c` int(11) DEFAULT NULL,PRIMARY KEY (`Id`));
4)設(shè)計(jì)存儲(chǔ)過程
CREATE PROCEDURE demoSp()BEGINDECLARE z INT;SELECT COUNT(*) INTO z FROM user;delete from user_view;insert into user_view(c) values(z);END;
5)設(shè)計(jì)調(diào)度并執(zhí)行,為了使實(shí)驗(yàn)明顯,我就把調(diào)度設(shè)置成5秒一次吧。周期可以自己調(diào)節(jié)。
CREATE EVENT `myEvent`ON SCHEDULE EVERY 5 SECONDON COMPLETION PRESERVEDO call demoSp();
四 總結(jié)
上面的實(shí)現(xiàn),可能不太明顯,但在海量數(shù)據(jù)處理的時(shí)候進(jìn)行統(tǒng)計(jì),性能有明顯的提升。大家做實(shí)驗(yàn)的時(shí)候,可以增加一個(gè)insert語句,方便觀察。在更新數(shù)據(jù)的時(shí)候,如果數(shù)據(jù)量大,則需要按下面步驟來處理
1)delete 1條記錄
2)insert 1條記錄
3)提交
如果一次性把數(shù)據(jù)全部刪除,在查詢的時(shí)候,有可能會(huì)出現(xiàn)空表的現(xiàn)象。而且會(huì)影響統(tǒng)計(jì)使用。
通過利用這個(gè)事件調(diào)度,定時(shí)備份的事情也同時(shí)解決了.
建議大家配合表分區(qū),索引同時(shí)使用,這樣可以提高性能.
未完成:在更新表的時(shí)候,需要采用某種算法來執(zhí)行,這樣才能提高性能,而不是單純的刪除再插入.
有問題大家請(qǐng)留言交流。版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處 ^-^
聯(lián)系客服