MySQL中實(shí)現(xiàn)高性能高并發(fā)計(jì)數(shù)器方案_MySQL教程
推薦:創(chuàng)建MySQL從庫(kù)我們知道Oracle有DataGuard實(shí)時(shí)備份數(shù)據(jù),可以做主備切換,而MySQL也有自己的一套備庫(kù)方案,稱之為主從復(fù)制。 搭建MySQL從庫(kù)是為了實(shí)時(shí)同步主庫(kù)數(shù)據(jù),同時(shí)也可以分擔(dān)主庫(kù)的讀壓力,對(duì)數(shù)據(jù)庫(kù)端做成讀寫(xiě)分離結(jié)構(gòu)。 搭建MySQL主從庫(kù)注意點(diǎn): 1.主庫(kù)和從庫(kù)的 server-id 一
現(xiàn)在有很多的項(xiàng)目,對(duì)計(jì)數(shù)器的實(shí)現(xiàn)甚是隨意,比如在實(shí)現(xiàn)網(wǎng)站文章點(diǎn)擊數(shù)的時(shí)候,是這么設(shè)計(jì)數(shù)據(jù)表的,如:”article_id, article_name, article_content, article_author, article_view……在article_view中記錄該文章的瀏覽量。詐一看似乎沒(méi)有問(wèn)題。對(duì)于小站,比如本博客,就是這么做的,因?yàn)樾〔说牟┛碗y道會(huì)涉及并發(fā)問(wèn)題嗎?答案顯而易見(jiàn),一天沒(méi)多少IP,而且以后不會(huì)很大。
言歸正傳,對(duì)文章資訊類為主的項(xiàng)目,在瀏覽一個(gè)頁(yè)面的時(shí)候不但要進(jìn)行大量的查(查詢上文的記錄,已經(jīng)所屬分類的名字、熱門文章資訊評(píng)論、TAG等),還要進(jìn)行寫(xiě)操作(更新瀏覽數(shù)點(diǎn)擊數(shù))。把文章的詳細(xì)內(nèi)容和計(jì)數(shù)器放在一張表盡管對(duì)開(kāi)發(fā)很方便,但是會(huì)造成數(shù)據(jù)庫(kù)的壓力過(guò)大(不然為什么大項(xiàng)目都要分庫(kù)分表呢)。
那么,分兩張表存放就好了么?一張表存文章詳細(xì)信息,另一張表單獨(dú)存計(jì)數(shù)器。
代碼如下:
CREATE TABLE `article_view`(
`article_id` int(11) NOT NULL,
`view` int(11) NOT NULL,
PRIMARY KEY (`article_id`)
)ENGINE=InnoDB;
這種方式,雖然分擔(dān)了文章表的壓力,但是每當(dāng)有一個(gè)進(jìn)程請(qǐng)求更新的時(shí)候,都會(huì)產(chǎn)生全局的互斥鎖,只能串行,不能并行。在高并發(fā)下會(huì)有較長(zhǎng)的等待時(shí)間。
另一種比較好的辦法是對(duì)每一個(gè)文章的計(jì)數(shù)器不是一行,而是多行,比如吧,一百行。每次隨機(jī)更新其中一行,該文章的瀏覽數(shù)就是所有行的和。
代碼如下:
CREATE TABLE `article_view`(
`article_id` int(11) NOT NULL,
`pond` tinyint(4) NOT NULL COMMENT '池子,就是用來(lái)隨機(jī)用的',
`view` int(11) NOT NULL,
PRIMARY KEY (`article_id`,`pond`)
)ENGINE=InnoDB;
小訪問(wèn)量的隨機(jī)池子100個(gè)肯定多了,三五個(gè)足矣。每次訪問(wèn)的時(shí)候,隨機(jī)一個(gè)數(shù)字(1-100)作為pond,如何該pond存在則更新view+1,否則插入,view=1。借助DUPLICATE KEY,不然在程序里是實(shí)現(xiàn)得先SELECT,判斷一下再INSERT或者UPDATE。
代碼如下:
INSERT INTO `article_view` (`article_id`, `pond`, `view`) VALUES (`123`, RAND()*100, 1) ON DUPLICATE KEY UPDATE `view`=`view`+1
獲取指定文章的總訪問(wèn)量的時(shí)候:
代碼如下:
SELECT SUM(`view`) FROM `article_view` WHERE `article_id`='123'
PS:凡事都是雙刃劍。為了更快的讀我們通常要犧牲一些東西。在讀比較多的表要加快讀的速度,在寫(xiě)較多的表要加快寫(xiě)的速度。各自權(quán)衡。在加快讀的速度的時(shí)候,我們犧牲的并不僅僅是寫(xiě)的性能,還有開(kāi)發(fā)成本,開(kāi)發(fā)變的更復(fù)雜,維護(hù)成本等。所以并不是讀的速度越快越好,需要找一個(gè)平衡點(diǎn)。
分享:mysql語(yǔ)句中使用like后面的%(百分號(hào))的問(wèn)題問(wèn)題:mysql語(yǔ)句中使用like后面的%(百分號(hào)) 是不是越多執(zhí)行效率越慢! 總用時(shí):0.0489秒 0.0691 0.0485 0.0467 SELECT `goods_name`, `goods_img`, `sku_id`, `import` FROM `goods` WHERE `goods_name` LIKE '%iPhone%iPod%' AND `stime` 1413877244 AND `etime` 14138
- 創(chuàng)建MySQL從庫(kù)
- mysql語(yǔ)句中使用like后面的%(百分號(hào))的問(wèn)題
- sqlserver數(shù)據(jù)實(shí)時(shí)同步到mysql
- EXP-00091: Exporting questionable statistics
- 由于文件組 ‘DEFAULT’ 中的磁盤空間不足,無(wú)法為數(shù)據(jù)庫(kù) ‘TEMPDB’ 分配新頁(yè)
- sqlserver多版本查看版本號(hào)
- 如何正確查看 SQL Server 2005 版本號(hào)?
- SQL查詢語(yǔ)句中的bool類型字段值的寫(xiě)法
- SQL Server 2005建立與服務(wù)器的連接時(shí)出錯(cuò)的解決方案
- MySQL中GROUP BY的基本實(shí)現(xiàn)原理
- PHP實(shí)現(xiàn)將EXCEL文件導(dǎo)入到MYSQL
- mysql導(dǎo)入數(shù)據(jù)庫(kù)文件最大限制的修改
MySQL教程Rss訂閱編程教程搜索
MySQL教程推薦
- 網(wǎng)站模板:利用Shell腳本實(shí)現(xiàn)遠(yuǎn)程MySQL自動(dòng)查詢
- 深入探討:MySQL數(shù)據(jù)庫(kù)MyISAM與InnoDB存儲(chǔ)引擎的比較
- mysql5.6.10安裝詳細(xì)圖文教程
- 服務(wù)器不支持 MySql 數(shù)據(jù)庫(kù)的解決方法
- 設(shè)置mysql的sql_mode
- MySQL為什么會(huì)索引失效?
- mysql創(chuàng)建新用戶的命令
- MySQL DELETE語(yǔ)法使用詳細(xì)解析
- 基于MYSQL中優(yōu)化的一些方法
- 關(guān)于MySQL數(shù)據(jù)遷移--data目錄直接替換注意事項(xiàng)的詳解
猜你也喜歡看這些
- 解決SQL Server數(shù)據(jù)庫(kù)被掛馬的方法
- 如何解決MySQL 5數(shù)據(jù)庫(kù)連接超時(shí)問(wèn)題
- 解析在IIS中為SQL Server 2008配置報(bào)表服務(wù)
- 解讀SQL的select語(yǔ)句執(zhí)行順序
- order by newid() 各種數(shù)據(jù)庫(kù)隨機(jī)查詢的方法
- SQLite數(shù)據(jù)庫(kù)管理相關(guān)命令的使用介紹
- 解析數(shù)據(jù)庫(kù)安全管理的三個(gè)經(jīng)驗(yàn)
- sql2008安裝后服務(wù)器改名造成名稱不一致解決方法
- 數(shù)據(jù)庫(kù)的分離及附加
- SQL Server控制語(yǔ)句的基本應(yīng)用
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索MySQL中實(shí)現(xiàn)高性能高并發(fā)計(jì)數(shù)器方案
- 教程說(shuō)明:
MySQL教程-MySQL中實(shí)現(xiàn)高性能高并發(fā)計(jì)數(shù)器方案
。