久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

nosql優(yōu)化教程,nosql數(shù)據(jù)庫使用更加方便

簡述什么是nosql數(shù)據(jù)庫,并列舉兩種常見的nosql數(shù)據(jù)庫名稱及其特點

NoSQL太火,冒出太多產(chǎn)品了,保守估計也成百上千了。

10年積累的網(wǎng)站制作、成都做網(wǎng)站經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站設計后付款的網(wǎng)站建設流程,更有昌吉免費網(wǎng)站建設讓你可以放心的選擇與我們合作。

互聯(lián)網(wǎng)公司常用的基本集中在以下幾種,每種只舉一個比較常見或者應用比較成功的例子吧。

1. In-Memory KV Store : Redis

in memory key-value store,同時提供了更加豐富的數(shù)據(jù)結構和運算的能力,成功用法是替代memcached,通過checkpoint和commit log提供了快速的宕機恢復,同時支持replication提供讀可擴展和高可用。

2. Disk-Based KV Store: Leveldb

真正基于磁盤的key-value storage, 模型單一簡單,數(shù)據(jù)量不受限于內(nèi)存大小,數(shù)據(jù)落盤高可靠,Google的幾位大神出品的精品,LSM模型天然寫優(yōu)化,順序?qū)懕P的方式對于新硬件ssd再適合不過了,不足是僅提供了一個庫,需要自己封裝server端。

3. Document Store: Mongodb

分布式nosql,具備了區(qū)別mysql的最大亮點:可擴展性。mongodb 最新引人的莫過于提供了sql接口,是目前nosql里最像mysql的,只是沒有ACID的特性,發(fā)展很快,支持了索引等特性,上手容易,對于數(shù)據(jù)量遠超內(nèi)存限制的場景來說,還需要慎重。

4. Column Table Store: HBase

這個富二代似乎不用贅述了,最大的優(yōu)勢是開源,對于普通的scan和基于行的get等基本查詢,性能完全不是問題,只是只提供裸的api,易用性上是短板,可擴展性方面是最強的,其次坐上了Hadoop的快車,社區(qū)發(fā)展很快,各種基于其上的開源產(chǎn)品不少,來解決諸如join、聚集運算等復雜查詢。

企業(yè)應用系統(tǒng)架構優(yōu)化方法

企業(yè)應用系統(tǒng)架構優(yōu)化方法

系統(tǒng)優(yōu)化是一個全面而復雜的工作,很難通過某一方面的提升而獲得很好的效果,也很難在一朝一夕完成系統(tǒng)的全面優(yōu)化,每個系統(tǒng)都有其特性,需要綜合分析綜合考慮才能獲得比較好的效果。 我下面為大家整理了一些企業(yè)應用系統(tǒng)架構優(yōu)化的方法,歡迎閱讀參考:

1 實現(xiàn)動靜分離

所謂“動靜”分離,就是將靜態(tài)資源如圖片、CSS、Js等和動態(tài)資源如JSP、Servlet等進行分開的處理,通過使用不同的服務器,從而加快頁面的響應速度,這是目前互聯(lián)網(wǎng)應用最常用的方式之一,但是在企業(yè)應用端相對應用較少。

動靜分離至少有兩個方面的好處,一是提高了靜態(tài)資源的處理速度,因為應用服務器處理靜態(tài)資源的速度—般都不如專業(yè)的web服務器,第二個好處就是減少了應用服務器的負擔,應用服務器專注于處理動態(tài)請求,這對系統(tǒng)的穩(wěn)定運行是有很大的幫助的。

要實現(xiàn)動靜分離,有兩種方式,一種是在加載靜態(tài)資源的HTML語言中,將地址指定到不同的IP/域名上,實現(xiàn)徹底的分離。這種方式需要在設計之初進行考慮,并不適合優(yōu)化項目,因為這種修改會產(chǎn)生很大的工作量。第二種方式是通過分發(fā)器,攔截對靜態(tài)資源的訪問,將動態(tài)資源轉(zhuǎn)發(fā)給后端的應用服務器,實現(xiàn)動靜分離。這種方式的好處是不需要改動現(xiàn)有的代碼,僅需要做部署方式故調(diào)整,增加web服務器進行靜態(tài)資源的處理。示意圖如下:

目前轉(zhuǎn)發(fā)器比較多,既有老牌的Apache Web Server、有性能卓越的Zeus,也有目前如日中天的Nainx,不同的項目可以按照各自的需求進行選擇。

2 使用緩存技術

緩存技術是巨型項目、超大型項目中最重要的技術,范圍也比較廣,從前端的頁面、應用中的數(shù)據(jù)、數(shù)據(jù)庫本身等均可以進行緩存,每個方面使用的技術也千差萬別。使用緩存可以帶來兩個方面的好處,一是緩存的數(shù)據(jù)可以被高速加載,從內(nèi)存中讀取數(shù)據(jù)比通過數(shù)據(jù)庫或磁盤讀取具有更好的效率;二是最重要的,減少了數(shù)據(jù)庫服務器的壓力,有利于數(shù)據(jù)庫的穩(wěn)定,數(shù)據(jù)庫可以使用更多的資源進行查詢、統(tǒng)計等工作,有利于提高系統(tǒng)的整體運行速度。對于大中型應用而言,應用中的數(shù)據(jù)緩存和數(shù)據(jù)庫端的緩存是應該被考慮的。數(shù)據(jù)庫端的緩存在本文數(shù)據(jù)庫章節(jié)中進行描述,本節(jié)描述應用中數(shù)據(jù)的緩存。

要使用緩存,首先需要明確緩存的'內(nèi)容。一般優(yōu)化項目不建議做全部數(shù)據(jù)緩存,或者使用內(nèi)存數(shù)據(jù)庫之類的技術,這種修改工作量巨大,由此帶來的安全性、穩(wěn)定性、數(shù)據(jù)的一致性都可能存在較大的隱患。所以,緩存的內(nèi)容需要有所選擇,一般的說,應該根據(jù)數(shù)據(jù)的數(shù)據(jù)量、被讀取的次數(shù)、增加/更新頻率進行選擇。如果數(shù)據(jù)較少、增加/更新頻率非常低,那么應該考慮直接緩存在應用服務器端,只有對于重要性較高、讀取次數(shù)較多、增加/更新頻率相對適中的數(shù)據(jù),才適合使用獨立緩存。 確定緩存的內(nèi)容之后,就應該確定緩存的方式。對于緩存于應用服務器端的資源,一般選擇KEY-ALUE(OBJECT)進行緩存。對于獨立緩存,其內(nèi)容也KEY-VALUE的格式進行存儲(如果使用內(nèi)存數(shù)據(jù)庫實現(xiàn)緩存,那么存儲的就是與數(shù)據(jù)庫相同的信息),VALUE可以選擇SON或者Java Object,其中JSON占用空間較少,讀取的網(wǎng)絡流量較少,讀取之后需要進行轉(zhuǎn)換為Java對象;JavaXCN占用空間較大,讀取的網(wǎng)絡流量會較多,讀取之后無需進行轉(zhuǎn)化(前提是要求該對象已經(jīng)系列化),不同系統(tǒng)可以各自特點進行選擇。

對于獨立緩存,接下來的工作是選擇緩存服務器,緩存服務器選擇需要具有一定的原則:是否滿足已經(jīng)確定的緩存方式、對操作系統(tǒng)要求如何、穩(wěn)定性如何、是否支持分布式、是否支持多節(jié)點熱備、客戶端(即JAVA調(diào)用接口)接口是否支持漂移(一個節(jié)點崩潰是否能轉(zhuǎn)移到另外的節(jié)點)、客戶端是否高效等等。從目前業(yè)界來看,memcached、redis都是應用比較廣泛的緩存服務器。

選擇完緩存服務器之后,就需要對系統(tǒng)的代碼進行一定的改造。改造的內(nèi)容就是將通過數(shù)據(jù)庫讀取的信息改為從緩存服務器獲得,而對數(shù)據(jù)的保存、修改、刪除操作,既要操作數(shù)據(jù)庫上的數(shù)據(jù),也需要對緩存服務器的信息進行更新,如下圖所示:

由于是對系統(tǒng)的優(yōu)化,那么系統(tǒng)中已經(jīng)具有很多數(shù)據(jù)且并未進入緩存,因此還需要將緩存服務器中的數(shù)據(jù)進行初始化。有兩種方式來進行,一種方式是直接將數(shù)據(jù)庫中的數(shù)據(jù)一次性加載到緩存服務器,另外一種方式是在修改Load數(shù)據(jù)的方式,先從緩存服務器獲取,如果沒有,則從數(shù)據(jù)庫獲取,然后同步到緩存服務器上。對于優(yōu)化項目,建議使用第二種方式。第二種方式一個額外的好處就是當緩存服務器全部不可用時,系統(tǒng)也能提供完整的服務。

3 使用異步日志記錄

對于企業(yè)應用而言,對用戶的操作的記錄是很重要的,在系統(tǒng)出現(xiàn)某些問題的時候,可以通過日志進行數(shù)據(jù)恢復。一般系統(tǒng)要么沒有進行記錄,要么使用數(shù)據(jù)庫進行同步記錄。這部分數(shù)據(jù)會比較龐大,少則百萬級,多則數(shù)億,并且隨著使用量的增加而逐漸增加。這些表屬于使用率最高的表之一,在這些表上進行經(jīng)常性數(shù)據(jù)插入,有可能會變成系統(tǒng)的噩夢。

為了解決這個問題,引入異步日志記錄,是較為理想的選擇。通過在web容器中增加過濾器,攔截用戶的請求,然后將用戶的請求和表單數(shù)據(jù)封裝為JSON格式的數(shù)據(jù),采用異步方式發(fā)送到NoSQL數(shù)據(jù)庫,需要恢復的時候,通過對JSON數(shù)據(jù)進行還原。這種方式有如下好處:

1)不需要改動現(xiàn)有代碼而進行了用戶操作記錄;

2)由于采用異步模式,幾乎不會增加用戶操作的時間;

3)采用NoSQL+JSON存儲,不用為每一類操作特別設置特定的表結構,修改簡單。

目前的NoSQL數(shù)據(jù)庫也逐漸顯露頭角,根據(jù)DB Engines在今年10月發(fā)布的數(shù)據(jù)庫排名中,MongoDB的NoSQL服務器已經(jīng)躍居第七位,因此NoSQL服務器目前推薦使用MongoDB。

;

如何選擇NoSQL數(shù)據(jù)庫

NoSQL,指的是非關系型的數(shù)據(jù)庫。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關系數(shù)據(jù)庫在應付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的

SNS類型的web2.0純動態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問題,而非關系型的數(shù)據(jù)庫則由于其本身的特點得到了非常迅速的發(fā)展。

NoSQL(NoSQL

= Not Only SQL

),意即“不僅僅是SQL”,是一項全新的數(shù)據(jù)庫革命性運動,早期就有人提出,發(fā)展至2009年趨勢越發(fā)高漲。NoSQL的擁護者們提倡運用非關系型的數(shù)

據(jù)存儲,相對于鋪天蓋地的關系型數(shù)據(jù)庫運用,這一概念無疑是一種全新的思維的注入。

從這一新興技術中選擇一款正確的NoSQL數(shù)據(jù)庫是非常具有挑戰(zhàn)性的。比一下網(wǎng)建議在選擇時考慮以下因素:

并發(fā)控制

發(fā)控制指的是當多個用戶同時更新運行時,用于保護數(shù)據(jù)庫完整性的各種技術。并發(fā)機制不正確可能導致臟讀、幻讀和不可重復讀等此類問題。并發(fā)控制的目的是保

證一個用戶的工作不會對另一個用戶的工作產(chǎn)生不合理的影響。在某些情況下,這些措施保證了當用戶和其他用戶一起操作時,所得的結果和她單獨操作時的結果是

一樣的。在另一些情況下,這表示用戶的工作按預定的方式受其他用戶的影響。

封鎖

就是事務T在對某個數(shù)據(jù)對象(例如表、記錄等)操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務T就對該數(shù)據(jù)對象有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此數(shù)據(jù)對象。

封鎖是一次只允許一個用戶讀取或修改的一種機制,是實現(xiàn)并發(fā)控制的一個非常重要的技術。

MVCC

Multi-Version Concurrency Control多版本并發(fā)控制,維持一個數(shù)據(jù)的多個版本使讀寫操作沒有沖突。MVCC優(yōu)化了數(shù)據(jù)庫并發(fā)系統(tǒng),使系統(tǒng)在有大量并發(fā)用戶時得到最高的性能,并且可以不用關閉服務器就直接進行熱備份。

ACID

數(shù)據(jù)庫事務正確執(zhí)行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久

性(Durability)。一個支持事務(Transaction)的數(shù)據(jù)庫系統(tǒng),必需要具有這四種特性,否則在事務過程(Transaction

processing)當中無法保證數(shù)據(jù)的正確性,交易過程極可能達不到交易方的要求。

None

一些系統(tǒng)不提供原子性。

鏡像

數(shù)據(jù)庫鏡像是DBMS根據(jù)DBA的要求,自動把整個數(shù)據(jù)庫或其中的關鍵數(shù)據(jù)復制到另一個磁盤上,每當主數(shù)據(jù)庫更新時,DBMS會自動把更新后的數(shù)據(jù)復制過去,即DBMS自動保證鏡像數(shù)據(jù)與主數(shù)據(jù)的一致性。

鏡像分為同步和異步。

數(shù)據(jù)存儲

指的是數(shù)據(jù)的物理特性怎樣被存儲在數(shù)據(jù)庫中。

磁盤 數(shù)據(jù)被存儲在硬盤驅(qū)動器里;

GFS或谷歌文件系統(tǒng)是一個由谷歌開發(fā)的專有的分布式文件系統(tǒng);

Hadoop是Apache軟件框架,免費許可下支持數(shù)據(jù)密集型分布式應用程序;

RAM隨機存儲器;

插件 可以添加外部插件;

Amazon S3通過Web服務接口提供存儲;

BDB:BDB

全稱是 “Berkeley DB”,它是MySQL具有事務能力的表類型,由Sleepycat

Software開發(fā)。BDB表類型提供了MySQL用戶長久期盼的功能,即事務控制能力。在任何RDBMS中,事務控制能力都是一種極其重要和寶貴的功

能。事務控制能力使得我們能夠確保一組命令確實已經(jīng)全部執(zhí)行成功,或者確保當任何一個命令出現(xiàn)錯誤時所有命令的執(zhí)行結果均被退回。

實現(xiàn)語言

實現(xiàn)語言會影響數(shù)據(jù)庫的發(fā)展速度。典型的NoSQL數(shù)據(jù)庫是用低級語言如C / C + +編寫的。另一方面,那些更高層次的語言如Java,使自定義更容易。

實現(xiàn)語言有:C, C++, Erlang, Java, Python

特性

考慮下列哪一個特點對你的數(shù)據(jù)庫是最重要的:

持久性

可用性

一致性

分區(qū)容忍性

證書類型

下面這些許可證是一個不同的開放源碼許可的形式:

GPL:通用公共許可證

BSD:伯克利軟件分發(fā)

MPL:Mozilla公共許可證

EPL:Eclipse公共許可證

IDPL:最初的開發(fā)者的公共許可證

LGPL:較寬松通用公共許可證

存儲類型

存儲類型是NoSQL數(shù)據(jù)庫最大的不同,是決定使用哪款數(shù)據(jù)庫的一個首要指標。

關鍵字:支持get、put和刪除操作

按列存儲:相對于傳統(tǒng)的按行存儲,數(shù)據(jù)集成容易多了

面向文件系統(tǒng):存儲像是JSON或XML這樣的結構化文件,很容易就能從面向?qū)ο筌浖蝎@取數(shù)據(jù)。

MySQL數(shù)據(jù)庫性能優(yōu)化之分區(qū)分表分庫

分表是分散數(shù)據(jù)庫壓力的好方法。

分表,最直白的意思,就是將一個表結構分為多個表,然后,可以再同一個庫里,也可以放到不同的庫。

當然,首先要知道什么情況下,才需要分表。個人覺得單表記錄條數(shù)達到百萬到千萬級別時就要使用分表了。

分表的分類

**1、縱向分表**

將本來可以在同一個表的內(nèi)容,人為劃分為多個表。(所謂的本來,是指按照關系型數(shù)據(jù)庫的第三范式要求,是應該在同一個表的。)

分表理由:根據(jù)數(shù)據(jù)的活躍度進行分離,(因為不同活躍的數(shù)據(jù),處理方式是不同的)

案例:

對于一個博客系統(tǒng),文章標題,作者,分類,創(chuàng)建時間等,是變化頻率慢,查詢次數(shù)多,而且最好有很好的實時性的數(shù)據(jù),我們把它叫做冷數(shù)據(jù)。而博客的瀏覽量,回復數(shù)等,類似的統(tǒng)計信息,或者別的變化頻率比較高的數(shù)據(jù),我們把它叫做活躍數(shù)據(jù)。所以,在進行數(shù)據(jù)庫結構設計的時候,就應該考慮分表,首先是縱向分表的處理。

這樣縱向分表后:

首先存儲引擎的使用不同,冷數(shù)據(jù)使用MyIsam 可以有更好的查詢數(shù)據(jù)?;钴S數(shù)據(jù),可以使用Innodb ,可以有更好的更新速度。

其次,對冷數(shù)據(jù)進行更多的從庫配置,因為更多的操作時查詢,這樣來加快查詢速度。對熱數(shù)據(jù),可以相對有更多的主庫的橫向分表處理。

其實,對于一些特殊的活躍數(shù)據(jù),也可以考慮使用memcache ,redis之類的緩存,等累計到一定量再去更新數(shù)據(jù)庫?;蛘適ongodb 一類的nosql 數(shù)據(jù)庫,這里只是舉例,就先不說這個。

**2、橫向分表**

字面意思,就可以看出來,是把大的表結構,橫向切割為同樣結構的不同表,如,用戶信息表,user_1,user_2等。表結構是完全一樣,但是,根據(jù)某些特定的規(guī)則來劃分的表,如根據(jù)用戶ID來取模劃分。

分表理由:根據(jù)數(shù)據(jù)量的規(guī)模來劃分,保證單表的容量不會太大,從而來保證單表的查詢等處理能力。

案例:同上面的例子,博客系統(tǒng)。當博客的量達到很大時候,就應該采取橫向分割來降低每個單表的壓力,來提升性能。例如博客的冷數(shù)據(jù)表,假如分為100個表,當同時有100萬個用戶在瀏覽時,如果是單表的話,會進行100萬次請求,而現(xiàn)在分表后,就可能是每個表進行1萬個數(shù)據(jù)的請求(因為,不可能絕對的平均,只是假設),這樣壓力就降低了很多很多。

延伸:為什么要分表和分區(qū)?

日常開發(fā)中我們經(jīng)常會遇到大表的情況,所謂的大表是指存儲了百萬級乃至千萬級條記錄的表。這樣的表過于龐大,導致數(shù)據(jù)庫在查詢和插入的時候耗時太長,性能低下,如果涉及聯(lián)合查詢的情況,性能會更加糟糕。分表和表分區(qū)的目的就是減少數(shù)據(jù)庫的負擔,提高數(shù)據(jù)庫的效率,通常點來講就是提高表的增刪改查效率。

什么是分表?

分表是將一個大表按照一定的規(guī)則分解成多張具有獨立存儲空間的實體表,我們可以稱為子表,每個表都對應三個文件,MYD數(shù)據(jù)文件,.MYI索引文件,.frm表結構文件。這些子表可以分布在同一塊磁盤上,也可以在不同的機器上。app讀寫的時候根據(jù)事先定義好的規(guī)則得到對應的子表名,然后去操作它。

什么是分區(qū)?

分區(qū)和分表相似,都是按照規(guī)則分解表。不同在于分表將大表分解為若干個獨立的實體表,而分區(qū)是將數(shù)據(jù)分段劃分在多個位置存放,可以是同一塊磁盤也可以在不同的機器。分區(qū)后,表面上還是一張表,但數(shù)據(jù)散列到多個位置了。app讀寫的時候操作的還是大表名字,db自動去組織分區(qū)的數(shù)據(jù)。

**MySQL分表和分區(qū)有什么聯(lián)系呢?**

1、都能提高mysql的性高,在高并發(fā)狀態(tài)下都有一個良好的表現(xiàn)。

2、分表和分區(qū)不矛盾,可以相互配合的,對于那些大訪問量,并且表數(shù)據(jù)比較多的表,我們可以采取分表和分區(qū)結合的方式(如果merge這種分表方式,不能和分區(qū)配合的話,可以用其他的分表試),訪問量不大,但是表數(shù)據(jù)很多的表,我們可以采取分區(qū)的方式等。

3、分表技術是比較麻煩的,需要手動去創(chuàng)建子表,app服務端讀寫時候需要計算子表名。采用merge好一些,但也要創(chuàng)建子表和配置子表間的union關系。

4、表分區(qū)相對于分表,操作方便,不需要創(chuàng)建子表。

我們知道對于大型的互聯(lián)網(wǎng)應用,數(shù)據(jù)庫單表的數(shù)據(jù)量可能達到千萬甚至上億級別,同時面臨這高并發(fā)的壓力。Master-Slave結構只能對數(shù)據(jù)庫的讀能力進行擴展,寫操作還是集中在Master中,Master并不能無限制的掛接Slave庫,如果需要對數(shù)據(jù)庫的吞吐能力進行進一步的擴展,可以考慮采用分庫分表的策略。

**1、分表**

在分表之前,首先要選中合適的分表策略(以哪個字典為分表字段,需要將數(shù)據(jù)分為多少張表),使數(shù)據(jù)能夠均衡的分布在多張表中,并且不影響正常的查詢。在企業(yè)級應用中,往往使用org_id(組織主鍵)做為分表字段,在互聯(lián)網(wǎng)應用中往往是userid。在確定分表策略后,當數(shù)據(jù)進行存儲及查詢時,需要確定到哪張表里去查找數(shù)據(jù),

數(shù)據(jù)存放的數(shù)據(jù)表 = 分表字段的內(nèi)容 % 分表數(shù)量

**2、分庫**

分表能夠解決單表數(shù)據(jù)量過大帶來的查詢效率下降的問題,但是不能給數(shù)據(jù)庫的并發(fā)訪問帶來質(zhì)的提升,面對高并發(fā)的寫訪問,當Master無法承擔高并發(fā)的寫入請求時,不管如何擴展Slave服務器,都沒有意義了。我們通過對數(shù)據(jù)庫進行拆分,來提高數(shù)據(jù)庫的寫入能力,即所謂的分庫。分庫采用對關鍵字取模的方式,對數(shù)據(jù)庫進行路由。

數(shù)據(jù)存放的數(shù)據(jù)庫=分庫字段的內(nèi)容%數(shù)據(jù)庫的數(shù)量

**3、即分表又分庫**

數(shù)據(jù)庫分表可以解決單表海量數(shù)據(jù)的查詢性能問題,分庫可以解決單臺數(shù)據(jù)庫的并發(fā)訪問壓力問題。

當數(shù)據(jù)庫同時面臨海量數(shù)據(jù)存儲和高并發(fā)訪問的時候,需要同時采取分表和分庫策略。一般分表分庫策略如下:

中間變量 = 關鍵字%(數(shù)據(jù)庫數(shù)量*單庫數(shù)據(jù)表數(shù)量)

庫 = 取整(中間變量/單庫數(shù)據(jù)表數(shù)量)

表 = (中間變量%單庫數(shù)據(jù)表數(shù)量)

實例:

1、分庫分表

很明顯,一個主表(也就是很重要的表,例如用戶表)無限制的增長勢必嚴重影響性能,分庫與分表是一個很不錯的解決途徑,也就是性能優(yōu)化途徑,現(xiàn)在的案例是我們有一個1000多萬條記錄的用戶表members,查詢起來非常之慢,同事的做法是將其散列到100個表中,分別從members0到members99,然后根據(jù)mid分發(fā)記錄到這些表中,牛逼的代碼大概是這樣子:

復制代碼 代碼如下:

?php

for($i=0;$i 100; $i++ ){

//echo "CREATE TABLE db2.members{$i} LIKE db1.members

";

echo "INSERT INTO members{$i} SELECT * FROM members WHERE mid%100={$i}

";

}

?

2、不停機修改mysql表結構

同樣還是members表,前期設計的表結構不盡合理,隨著數(shù)據(jù)庫不斷運行,其冗余數(shù)據(jù)也是增長巨大,同事使用了下面的方法來處理:

先創(chuàng)建一個臨時表:

/*創(chuàng)建臨時表*/

CREATE TABLE members_tmp LIKE members

然后修改members_tmp的表結構為新結構,接著使用上面那個for循環(huán)來導出數(shù)據(jù),因為1000萬的數(shù)據(jù)一次性導出是不對的,mid是主鍵,一個區(qū)間一個區(qū)間的導,基本是一次導出5萬條吧,這里略去了

接著重命名將新表替換上去:

/*這是個頗為經(jīng)典的語句哈*/

RENAME TABLE members TO members_bak,members_tmp TO members;

就是這樣,基本可以做到無損失,無需停機更新表結構,但實際上RENAME期間表是被鎖死的,所以選擇在線少的時候操作是一個技巧。經(jīng)過這個操作,使得原先8G多的表,一下子變成了2G多。

你覺得數(shù)據(jù)庫這個課怎么樣?

普通。就是學習數(shù)據(jù)庫的操作而已。讀取,編輯,刪除這三種操作邏輯。只要記憶力好,把那幾種命令語句背下來,基本的操作就沒問題。這對今后的其他課程尤其是編程是有幫助的,因為有些軟件會設計到數(shù)據(jù)庫的讀寫操作。尤其是一些網(wǎng)站,肯定會連接數(shù)據(jù)庫。不會數(shù)據(jù)庫操作,就沒辦法制作動態(tài)網(wǎng)站。

為什么要使用NoSQL?NOSQL的優(yōu)勢

這次的NoSQL專欄系列將先整體介紹NoSQL,然后介紹如何把NoSQL運用到自己的項目中合適的場景中,還會適當?shù)胤治鲆恍┏晒Π咐M谐晒κ褂肗oSQL經(jīng)驗的朋友給我提供一些線索和信息。

NoSQL概念隨著web2.0的快速發(fā)展,非關系型、分布式數(shù)據(jù)存儲得到了快速的發(fā)展,它們不保證關系數(shù)據(jù)的ACID特性。NoSQL概念在2009年被提了出來。NoSQL最常見的解釋是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一詞最早于1998年被用于一個輕量級的關系數(shù)據(jù)庫的名字。)

NoSQL被我們用得最多的當數(shù)key-value存儲,當然還有其他的文檔型的、列存儲、圖型數(shù)據(jù)庫、xml數(shù)據(jù)庫等。在NoSQL概念提出之前,這些數(shù)據(jù)庫就被用于各種系統(tǒng)當中,但是卻很少用于web互聯(lián)網(wǎng)應用。比如cdb、qdbm、bdb數(shù)據(jù)庫。

傳統(tǒng)關系數(shù)據(jù)庫的瓶頸

傳統(tǒng)的關系數(shù)據(jù)庫具有不錯的性能,高穩(wěn)定型,久經(jīng)歷史考驗,而且使用簡單,功能強大,同時也積累了大量的成功案例。在互聯(lián)網(wǎng)領域,MySQL成為了絕對靠前的王者,毫不夸張的說,MySQL為互聯(lián)網(wǎng)的發(fā)展做出了卓越的貢獻。

在90年代,一個網(wǎng)站的訪問量一般都不大,用單個數(shù)據(jù)庫完全可以輕松應付。在那個時候,更多的都是靜態(tài)網(wǎng)頁,動態(tài)交互類型的網(wǎng)站不多。

到了最近10年,網(wǎng)站開始快速發(fā)展?;鸨恼搲?、博客、sns、微博逐漸引領web領域的潮流。在初期,論壇的流量其實也不大,如果你接觸網(wǎng)絡比較早,你可能還記得那個時候還有文本型存儲的論壇程序,可以想象一般的論壇的流量有多大。

Memcached+MySQL

后來,隨著訪問量的上升,幾乎大部分使用MySQL架構的網(wǎng)站在數(shù)據(jù)庫上都開始出現(xiàn)了性能問題,web程序不再僅僅專注在功能上,同時也在追求性能。程序員們開始大量的使用緩存技術來緩解數(shù)據(jù)庫的壓力,優(yōu)化數(shù)據(jù)庫的結構和索引。開始比較流行的是通過文件緩存來緩解數(shù)據(jù)庫壓力,但是當訪問量繼續(xù)增大的時候,多臺web機器通過文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。在這個時候,Memcached就自然的成為一個非常時尚的技術產(chǎn)品。

Memcached作為一個獨立的分布式的緩存服務器,為多個web服務器提供了一個共享的高性能緩存服務,在Memcached服務器上,又發(fā)展了根據(jù)hash算法來進行多臺Memcached緩存服務的擴展,然后又出現(xiàn)了一致性hash來解決增加或減少緩存服務器導致重新hash帶來的大量緩存失效的弊端。當時,如果你去面試,你說你有Memcached經(jīng)驗,肯定會加分的。

Mysql主從讀寫分離

由于數(shù)據(jù)庫的寫入壓力增加,Memcached只能緩解數(shù)據(jù)庫的讀取壓力。讀寫集中在一個數(shù)據(jù)庫上讓數(shù)據(jù)庫不堪重負,大部分網(wǎng)站開始使用主從復制技術來達到讀寫分離,以提高讀寫性能和讀庫的可擴展性。Mysql的master-slave模式成為這個時候的網(wǎng)站標配了。

分表分庫隨著web2.0的繼續(xù)高速發(fā)展,在Memcached的高速緩存,MySQL的主從復制,讀寫分離的基礎之上,這時MySQL主庫的寫壓力開始出現(xiàn)瓶頸,而數(shù)據(jù)量的持續(xù)猛增,由于MyISAM使用表鎖,在高并發(fā)下會出現(xiàn)嚴重的鎖問題,大量的高并發(fā)MySQL應用開始使用InnoDB引擎代替MyISAM。同時,開始流行使用分表分庫來緩解寫壓力和數(shù)據(jù)增長的擴展問題。這個時候,分表分庫成了一個熱門技術,是面試的熱門問題也是業(yè)界討論的熱門技術問題。也就在這個時候,MySQL推出了還不太穩(wěn)定的表分區(qū),這也給技術實力一般的公司帶來了希望。雖然MySQL推出了MySQL Cluster集群,但是由于在互聯(lián)網(wǎng)幾乎沒有成功案例,性能也不能滿足互聯(lián)網(wǎng)的要求,只是在高可靠性上提供了非常大的保證。

MySQL的擴展性瓶頸

在互聯(lián)網(wǎng),大部分的MySQL都應該是IO密集型的,事實上,如果你的MySQL是個CPU密集型的話,那么很可能你的MySQL設計得有性能問題,需要優(yōu)化了。大數(shù)據(jù)量高并發(fā)環(huán)境下的MySQL應用開發(fā)越來越復雜,也越來越具有技術挑戰(zhàn)性。分表分庫的規(guī)則把握都是需要經(jīng)驗的。雖然有像淘寶這樣技術實力強大的公司開發(fā)了透明的中間件層來屏蔽開發(fā)者的復雜性,但是避免不了整個架構的復雜性。分庫分表的子庫到一定階段又面臨擴展問題。還有就是需求的變更,可能又需要一種新的分庫方式。

MySQL數(shù)據(jù)庫也經(jīng)常存儲一些大文本字段,導致數(shù)據(jù)庫表非常的大,在做數(shù)據(jù)庫恢復的時候就導致非常的慢,不容易快速恢復數(shù)據(jù)庫。比如1000萬4KB大小的文本就接近40GB的大小,如果能把這些數(shù)據(jù)從MySQL省去,MySQL將變得非常的小。

關系數(shù)據(jù)庫很強大,但是它并不能很好的應付所有的應用場景。MySQL的擴展性差(需要復雜的技術來實現(xiàn)),大數(shù)據(jù)下IO壓力大,表結構更改困難,正是當前使用MySQL的開發(fā)人員面臨的問題。

NOSQL的優(yōu)勢易擴展NoSQL數(shù)據(jù)庫種類繁多,但是一個共同的特點都是去掉關系數(shù)據(jù)庫的關系型特性。數(shù)據(jù)之間無關系,這樣就非常容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。

大數(shù)據(jù)量,高性能

NoSQL數(shù)據(jù)庫都具有非常高的讀寫性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無關系性,數(shù)據(jù)庫的結構簡單。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對web2.0的交互頻繁的應用,Cache性能不高。而NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說就要性能高很多了。

靈活的數(shù)據(jù)模型

NoSQL無需事先為要存儲的數(shù)據(jù)建立字段,隨時可以存儲自定義的數(shù)據(jù)格式。而在關系數(shù)據(jù)庫里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡直就是一個噩夢。這點在大數(shù)據(jù)量的web2.0時代尤其明顯。

高可用NoSQL在不太影響性能的情況,就可以方便的實現(xiàn)高可用的架構。比如Cassandra,HBase模型,通過復制模型也能實現(xiàn)高可用。

總結NoSQL數(shù)據(jù)庫的出現(xiàn),彌補了關系數(shù)據(jù)(比如MySQL)在某些方面的不足,在某些方面能極大的節(jié)省開發(fā)成本和維護成本。

MySQL和NoSQL都有各自的特點和使用的應用場景,兩者的緊密結合將會給web2.0的數(shù)據(jù)庫發(fā)展帶來新的思路。

本文題目:nosql優(yōu)化教程,nosql數(shù)據(jù)庫使用更加方便
網(wǎng)頁路徑:http://sd-ha.com/article48/hdheep.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司、品牌網(wǎng)站制作、網(wǎng)站導航微信小程序、外貿(mào)網(wǎng)站建設、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)