国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
MySQL的經(jīng)典用法(三)----海量數(shù)據(jù)統(tǒng)計(jì)處理,模擬物化視圖

MySQL的經(jīng)典用法(三)----海量數(shù)據(jù)統(tǒng)計(jì)處理,模擬物化視圖

文章分類:數(shù)據(jù)庫

一 物化視圖
    物化視圖,它是用于預(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差不多。

Sql代碼
  1. show processlist; --這個(gè)命令能是查看線程,如果啟動(dòng)了時(shí)間調(diào)度器,則會(huì)多個(gè)event_scheduler   
  2. set global event_scheduler = on--啟動(dòng)時(shí)間調(diào)度器,關(guān)閉就不用我說了吧,off就可以了   
  3. show processlist\G;--查看線程,是不是多了個(gè) User: event_scheduler   
  4.   
  5. --如果想啟動(dòng)單個(gè)事件,則執(zhí)行下面命令   
  6. ALTER EVENT `myEvent`    
  7. ON COMPLETION PRESERVE    
  8. ENABLE;   
  9. --關(guān)閉   
  10. ALTER EVENT `myEvent`    
  11. ON COMPLETION PRESERVE    
  12. DISABLE;  

mysql默認(rèn)不會(huì)啟動(dòng)event,所以需要修改你的my.ini或my.cnf[mysqld]的下面加入如下行

event_scheduler=1

三 模擬物化視圖
    1)先建個(gè)基表吧。

Sql代碼
  1. CREATE TABLE `user` (   
  2.   `Id` int(11) NOT NULL AUTO_INCREMENT,   
  3.   `namevarchar(255) DEFAULT NULL,   
  4.   `age` int(11) DEFAULT NULL,   
  5.   PRIMARY KEY (`Id`)   
  6. );  



    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)建"物化視圖"的表

Sql代碼
  1. CREATE TABLE `user_view` (   
  2.   `Id` int(11) NOT NULL AUTO_INCREMENT,   
  3.   `c` int(11) DEFAULT NULL,   
  4.   PRIMARY KEY (`Id`)   
  5. );  


    4)設(shè)計(jì)存儲(chǔ)過程

Sql代碼
  1. CREATE PROCEDURE demoSp()   
  2. BEGIN  
  3.     DECLARE z INT;   
  4. SELECT COUNT(*) INTO z FROM user;   
  5. delete from user_view;   
  6. insert into user_view(c) values(z);   
  7. END;  



    5)設(shè)計(jì)調(diào)度并執(zhí)行,為了使實(shí)驗(yàn)明顯,我就把調(diào)度設(shè)置成5秒一次吧。周期可以自己調(diào)節(jié)。

Sql代碼
  1. CREATE EVENT `myEvent`    
  2. ON SCHEDULE EVERY 5 SECOND    
  3. ON COMPLETION PRESERVE    
  4. DO 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)注明出處 ^-^

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
通過游標(biāo)高效的完成商品點(diǎn)擊量的統(tǒng)計(jì) 優(yōu)就業(yè)
[Err] 1289
highcharts實(shí)例教程一:結(jié)合php與mysql生成折線圖
ClickHouse的物化視圖及MySQL表引擎
mysql建表多個(gè)timestamp
[MySQL]創(chuàng)建表
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服