文:https://www.enmotech.com/web/detail/1/838/1.html (復制鏈接,打開瀏覽器即可查看)
北冥有 Data,其名為鯤,鯤之大,一個 MySQL 放不下。千萬量級的數據,用 MySQL 要怎么存?
初學者在看到這個問題的時候,可能首先想到的是 MySQL 一張表到底能存放多少條數據?
根據 MySQL 官方文檔的介紹,MySQL 理論上限是 (232)2 條數據,然而實際操作中,往往還受限于下面兩條因素:
1. myisamdatapointersize,MySQL 的 myisamdatapointersize 一般默認是 6,即 48 位,那么對應的行數就是 248-1。
2. 表的存儲大小 256TB
那有人會說,只要我的數據大小不超過上限,數據行數也不超過上限,是不是就沒有問題了?其實不盡然。
在實際項目中,一般沒有哪個項目真的觸發到 MySQL 數據的上限了,因為當數據量變大了之后,查詢速度會慢的嚇人,而一般這個時候,你的數據量離 MySQL 的理論上限還遠著呢!
傳統的企業應用一般數據量都不大,數據也都比較容易處理,但是在互聯網項目中,上千萬、上億的數據量并不鮮見。在這種時候,還要保證數據庫的操作效率,我們就不得不考慮數據庫的分庫分表了。
那么接下來就和大家簡單聊一聊數據庫分庫分表的問題。
數據庫切分
看這個名字就知道,就是把一個數據庫切分成 N 多個數據庫,然后存放在不同的數據庫實例上面,這樣做有兩個好處:
1. 降低單臺數據庫實例的負載
2. 可以方便的實現對數據庫的擴容
一般來說,數據庫的切分有兩種不同的切分規則:
1. 水平切分
2. 垂直切分
接下來我們就對這兩種不同的切分規則分別進行介紹。
水平切分
先來一張簡單的示意圖,大家感受一下什么是水平切分:
假設我的 DB 中有 table-1、table-2 以及 table-3 三張表,水平切分就是拿著我的絕世好劍,對準黑色的線條,砍一劍或者砍 N 劍!
砍完之后,將砍掉的部分放到另外一個數據庫實例中,變成下面這樣:
這樣,原本放在一個 DB 中的 table 現在放在兩個 DB 中了,觀察之后我們發現:
1. 兩個 DB 中表的個數都是完整的,就是原來 DB 中有幾張表,現在還是幾張。
2. 每張表中的數據是不完整的,數據被拆分到了不同的 DB 中去了。
這就是數據庫的水平切分,也可以理解為按照數據行進行切分,即按照表中某個字段的某種規則來將表數據分散到多個庫之中,每個表中包含一部分數據。
這里的某種規則都包含哪些規則呢?這就涉及到數據庫的分片規則問題了,這個松哥在后面的文章中也會和大家一一展開詳述。這里先簡單說幾個常見的分片規則:
1. 按照日期劃分:不容日期的數據存放到不同的數據庫中。
2. 對 ID 取模:對表中的 ID 字段進行取模運算,根據取模結果將數據保存到不同的實例中。
3. 使用一致性哈希算法進行切分。
詳細的用法,將在后面的文章中和大家仔細說。
垂直切分
先來一張簡單的示意圖,大家感受一下垂直切分:
所謂的垂直切分就是拿著我的屠龍刀,對準了黑色的線條砍。砍完之后,將不同的表放到不同的數據庫實例中去,變成下面這個樣子:
這個時候我們發現如下幾個特點:
1. 每一個數據庫實例中的表的數量都是不完整的。
2. 每一個數據庫實例中表的數據是完整的。
這就是垂直切分。一般來說,垂直切分我們可以按照業務來劃分,不同業務的表放到不同的數據庫實例中。
老實說,在實際項目中,數據庫垂直切分并不是一件容易的事,因為表之間往往存在著復雜的跨庫 JOIN 問題,那么這個時候如何取舍,就要考驗架構師的水平了!
優缺點分析
通過上面的介紹,相信大家對于水平切分和垂直切分已經有所了解,優缺點其實也很明顯了,松哥再來和大家總結一下。
水平切分
· 優點
水平切分最大的優勢在于數據庫的擴展性好,提前選好切分規則,數據庫后期可以非常方便的進行擴容。
有效提高了數據庫穩定性和系統的負載能力。拆分規則抽象好, join 操作基本可以數據庫做。
· 缺點
水平切分后,分片事務一致性不容易解決。
拆分規則不易抽象,對架構師水平要求很高。
跨庫 join 性能較差。
垂直切分
· 優點
一般按照業務拆分,拆分后業務清晰,可以結合微服務一起食用。
系統之間整合或擴展相對要容易很多。
數據維護相對簡單。
· 缺點
最大的問題在于存在單庫性能瓶頸,數據表擴展不易。
跨庫 join 不易。
事務處理復雜。
結語
雖然 MySQL 中數據存儲的理論上限比較高,但是在實際開發中我們不會等到數據存不下的時候才去考慮分庫分表問題,因為在那之前,你就會明顯的感覺到數據庫的各項性能在下降,就要開始考慮分庫分表了。
想了解更多數據庫、云技術的內容嗎?
快來關注“數據和云”公眾號、“云和恩墨”官方網站,我們期待大家一同學習和進步!
數據和云小程序“DBASK”在線問答隨時解惑,歡迎了解和關注。
y_web.py(更新)
服務器軟件:Apache、IIS
瀏覽器是一個翻譯官,是一個解釋器。瀏覽器可以翻譯有HTML、CSS、JavaScript。
服務器端腳本程序:PHP、 .net、JSP、c#等
.php文件要由PHP腳本引擎來進行處理。
網站前臺(客戶端) 網站后臺(服務器端) 數據庫
HTML(結構) PHP MySQL
CSS JSP Oracle
JavaScript .net SqlServer
HTML結構:主要來說明,哪個地方是標題,哪個地方是段落,哪個地方是表格,哪個地方是表單。
CSS表現(格式):主要功能是,給相對應的HTML標記定義各種各樣的格式。
JavaScript行為:主要用于與計算機網頁進行交互(交流)。
塊元素和行內元素
塊元素:寬度單獨占一個通欄寬,塊元素的前臺的其它元素,都要另起一行來排。
比如:<p> <pre> <hr> <h1>……<h6> <ul> <ol> <li>
DIV和SPAN就是一個容器,容器中可以存放任何可以存放在<body>中的內容或標記。
行內元素:行內元素沒有寬度和高度的概念,也就是說通過CSS無法給行內元素增加寬和高。多個行內元素會放在同一行,不會另起一行來排版。
Direction:滾動的方向,取值:left、right、up、down
Behavior:滾動的方式,取值:scroll(滾動)、 alternate(彈動)、 slide(滾動一次)
Width:滾動的區域寬度,取值:px或%
Height;滾動的區域高度
bgColor:背景顏色,如:bgcolor=“#FF0000” bgcolor=“rgb(255,0,0)”
scrollAmount:滾動步長值,一步走多遠,值越大,走的越快
scrollDelay:兩次滾動的間隔時間,以毫秒為單位 1秒=1000毫秒
進制,就是一種進位方法。
10進制:有10個基本數,0、1、2、3、4、5、6、7、8、9,運算規則是:逢十進一
例如:9 10 19 20 29 30
2進制:有2個基本數,0、 1,運算規則是:逢二進一。比如:(10)2 11 100 101 110
8進制:有8個基本數,0、1、2、3、4、5、6、7,運算規則是:逢八進一。比如:(17)8 20 21 26 27 30
因為二進制太長,不方便記憶,因此小型機引入了八進制,八進制可以很好的反應二進制。
因此,一個八進制數,用3位二進制數來表示。
基R=2^3
16進制:有16個基本數,0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,運算規則是:逢16進一
比如:EF F0 F1 F2 FE FF (100)16
16進制的一位對應4位二進制。基R=2^4
10進制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
2進制 | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | 1011 | 1100 | |||||||
8進制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | |||
16進制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 |
十進制轉成二進制
分為整數部分和小數部分,分別轉換。比如:將(10.125)10轉成二進制? 1010.001
(1)整數部分轉成二進制:除2取余法。每次將整數除以2,取余數,一直除下去,直到整數部分(商)為0。最后讀數時,從下往上讀取。
第N次 | 整數10 | 商 | 余數 | ||
第1次 | 10/2 | 5 | 0 | ||
第2次 | 5/2 | 2 | 1 | ||
第3次 | 2/2 | 1 | 0 | ||
第4次 | 1/2 | 0 | 1 | 最后結果為:1010 | |
(2)小數部分轉成二進制:乘2除整法。每次將小數部分乘以2,取整數,一直乘下去,直到小數部分為0。最后讀數時,從上往下讀取。
第N次 | 小數0.125 | 積 | 整數 | ||
第1次 | 0.125*2 | 0.25 | 0 | ||
第2次 | 0.25*2 | 0.5 | 0 | ||
第3次 | 0.5*2 | 1.0 | 1 | ||
最后結果為:001 | |||||
二進制轉成十進制
不分整數部分和小數部分,按權相加法。換句話說:二進制上的每一位,乘以所在位權(也就是2的幾次方),最后將各個位的乘相加,就能得到十進制。
1010.001 = 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 + 0*2^-1 + 0*2^-2 + 1*2^-3 = 8+2+ 1/8 = 10+0.125 = 10.125
計算機只能二進制,比如:a-z、A-Z、0-9、標點符號,計算機都不能直接識別。每個人都可以來約定一套字符編碼(比如:a用二進制100表示,b用二進制101表示,c用二進制的110表示等)
計算機是由美國人發明的,美國標準化局同樣制定了一套統一的編碼,叫ASCII碼。
ASCII碼
ASCII編碼用7位或8位(1個字節)二進制來表示,共可以表示128或256個字符。包括:大小寫字母、數字、標點符號、圖形符號等。
每個國家都想讓計算機能顯示或處理本國的語言,都對ASCII碼進行了擴展。
在中國(簡體字),ANSI編碼是指GB2312或GBK。
在臺灣(繁體字),ANSI編碼是指BIG5
在日本,ANSI編碼是指JIS。
……
注意:ANSI編碼是跟隨操作一齊安裝的,也就是,安裝了中文操作系統后,它的默認編碼就是GB2312。
GB2312是中國標準化局,在1980年制定的一套顯示簡體中文的編碼。
GB2312是用2個字節來顯示。共可以表示2^16=256*256=65536個字符。
GB2312共保存了6763個常用漢字,一級漢字3700個。
GBK編碼
對GB2312進行了擴充,可以顯示人名、古漢語中的一些罕見字等。
GBK也是用2個字節來表示。共存儲了2.3萬個左右的中文字符。
GBK的范圍,要比GB2312大的多。
BIG5編碼
BIG5用于臺灣、香港、澳門地區的繁體中文編碼。
Unicode編碼
用4個字節表示字符,共可以表示42個億個字符。
Unicode編碼可以顯示世界上所有國家的語言。
缺點:文件龐大,效率不高,不利于推廣。
UTF-8統一格式轉換
它會自動根據不同的字符,來選擇不同編碼長度。
<meta>標記是設置一些網頁文件頭方面的信息。主要包括:網頁編碼或字符集設置、網頁關鍵字、網頁描述、網頁刷新跳轉等。相當于一封信的信封,信封有地址、郵編等重要。
<head>標記中的內容在瀏覽器中,是不可見的。
主要用兩個常用的屬性:
http-equiv:主要設置一些控制信息,屬性值是固定的。比如:content-type
name:一般用于設置網頁描述信息,像關鍵字、網頁描述、網頁版權、作者等,屬性值是固定的。比如:keywords
content:是具體的參數或內容,與http-equiv和name屬性進行對應。
(1)設置網頁的字符集或編碼
<meta http-equiv=“content-type” content=“text/html;charset=GBK”>
(2)設置網頁刷新或跳轉
<meta http-equiv=“refresh” content=“5”> 表示每隔5秒鐘,刷新網頁
<meta http-equiv=“refresh” content=“5;url=http://www.baidu.com”> 表示5秒鐘后,跳轉到百度網
注意:刷新功能相當于瀏覽器中的刷新按鈕
(3)設置網頁關鍵字(SEO優化),給搜索引擎(搜索機器人)使用
<meta name=“keywords” content=“程序開發,平面設置,空間域名,網站維護”>
(4)設置網頁描述信息(SEO優化)
<meta name=“description” content=“廣州網站建設思優網絡公司,提供專業廣州網站制作及網站推廣相結合的建站方案,由專業廣州網站設計人員結合搜索引擎優化經驗為您設計網站;廣州網頁設計:020-87537332”>
XHTML是可擴展超文本標注語言,XHTML是更純凈的HTML,語法更嚴格。
XHTML的目的是為了取代HTML4.01。
XHTML是W3C的一個標準或規范。
編寫XHTML的規范,與HTML編寫有何不同?
1)所有的標記都必須被關閉。比如:<br>轉換<br /> <hr>轉換后 <hr />
2)XHTML要求所有的標記名稱必須小寫。比如:<meta><table><img><font>
3)XHTML要求所有的屬性名必須小寫,屬性值必須加引號。
4)XHTML要求所有的屬性必須有值。
<hr noshade=“noshade” />
<input type=“radio” checked=“checked” />
5)所有的標記要順序嵌套,不能交叉嵌套;
6)XHTML文件,必須要有DTD文檔類型定義;
DTD(Document Type Define)文檔類型定義
(1)嚴格型Strict
要求HTML代中,不能存在任何的表現,用CSS去代替。比如:<font>、bgcolor、background等
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
(2)過渡型transitional
可以使用任何表現的標記或屬性。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
(3)框架型Frameset
制作框架網頁時使用的一種類型,框架主要用于網站的后臺管理。
框架技術:是將一個瀏覽器窗口劃分成不同區域,每個區域(窗口)都可以顯示一個獨立的網頁。(HTML第四天單獨講框架,現在作個了解)
W3C是萬維網聯盟,是一個國際性的非盈利性組織,是WEB領域最具權威性的組織。已經制定多達200多項的標準。
比如:XHTML、CSS、ECMAScript(JavaScript)、DOM、 XML等。
超級鏈接的功能:就是點擊某個鏈接,可以跳轉到目標頁面或文件。
超級鏈接的分類:
(1)按內容分類:文本鏈接、圖片鏈接、多媒體等
(2)按URL分類:相對URL、絕對URL、錨點
URL,指網址或路徑
URL(Uniform Resource Locator,統一資源定位器),也就是指互聯網地址。
http://www.sina.com.cn/about/index.html
第一個部分:協議,指訪問什么類型的服務器,如:http://、FTP://、news://
第二個部分:主機名或主機的IP地址。如:www.sina.com.cn
第三個部分:文件夾名,如:about
第四個部分:文件名,如:index.html
格式:<a 屬性=“屬性值”>新浪網</a>
常用的屬性:
Href:指鏈接的目標文件或網址。比如:href=“http://www.toutiao.com”
Target:指目標文件的打開方式。
_blank:在新窗口中,來打開目標文件;
_self:在當前窗口中,來打開目標文件;
_top:在最頂層窗口中,來打開目標文件(在框架中講);
_parent:在父窗口中,來打開目標文件(在框架中講)
Name:設置錨點的名稱。錨點是指:鏈接到同一個頁面的不同部分
舉例:<a href=http://www.toutiao.com target=“_blank”>頭條號</a>
絕對URL:它總是以file:///協議開頭,去訪問目標文件。
如果將當前文件移動到其它地方,這個絕對URL路徑不需要修改。
絕對URL,只需要確定目標文件的路徑即可,與當前文件位置無關。
例如:<a href=“file:///E:/itcast/20140510/lesson/day2/4.html”>本地絕對路徑</a>
相對URL:要確定當前文件與目標文件的關系。
關系分為三種:
平級關系:直接寫目標文件的文件名即可。
下級關系:也就是目標文件所在的文件夾與當前文件是平級關系,當前文件與目標文件是上下級關系。
上級關系:目標文件位于上一層級。
../代表上一層文件夾
../../代表上二層文件夾
../../images/01.jpg
提示:在制作網站時,一般使用的都是相對路徑。
(3)下載鏈接:如果鏈接到的文件,網頁不能直接執行的話,都會出現下載提示。
瀏覽器可以直接執行的文件:.gif、.jpg、.png、html、.htm、.mp3、.swf等
(4)郵箱鏈接:mailto:beijing2000@126.com
第一步:定義一個錨點或標記 <a name=“top”></a>
第二步:鏈接到錨點或標記 <a href=“#top”>返回頂部</a>
<a href=“intro.html#bottom”>鏈接到intro.html的底部</a>
格式:<img 屬性=“屬性值” />
常用的屬性:
Src:指圖片的URL,可以是相對路徑,也可以是絕對路徑。
Width:指圖片的寬度,單位px或%
Height:指圖片的高度
Align:圖片的水平對齊方式,取值:left center right ,left或right可以實現圖文混排
Alt:如果圖片不存在時,顯示的提示信息
Hspace:圖片左右的距離
Vspace:圖片上下的距離
舉例:<img src=“images/01.gif” width=“400” height=“300” alt=“寶寶圖片” />
如果保證圖片在調整過程中不變形(等比例縮放):只需要設置width和height其中一個即可,另一個會自動縮放。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。