mysql大表怎么優(yōu)化 mysql大表優(yōu)化的常用方案

MySQL 對(duì)于千萬級(jí)的大表要怎么優(yōu)化

MySQL 對(duì)于千萬級(jí)的大表的優(yōu)化:

創(chuàng)新互聯(lián)企業(yè)建站,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營(yíng)經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對(duì)于成都網(wǎng)站制作、做網(wǎng)站中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁中充分展現(xiàn),通過對(duì)客戶行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶提供的解決方案。

常用的優(yōu)化sql----突出快字,使完成操作的時(shí)間最短

1、用索引提高效率:

2、選擇有效率的表名順序,及數(shù)據(jù)結(jié)構(gòu)及字段;

3、使用DECODE函數(shù)可以避免重復(fù)掃描相同記錄或重復(fù)連接相同的表;

4、刪除重復(fù)記;

5、過內(nèi)部函數(shù)提高SQL效率;

......

讀寫分離-----操作不在一個(gè)表里完成

1、主數(shù)據(jù)庫A,進(jìn)行事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE);

2、從數(shù)據(jù)庫B,進(jìn)行SELECT查詢操作;

3、A復(fù)制到B,使數(shù)據(jù)保持一致性;

垂直劃分 ------數(shù)據(jù)不存儲(chǔ)在一個(gè)服務(wù)器里

按照功能劃分,把數(shù)據(jù)分別放到不同的數(shù)據(jù)庫和服務(wù)器。如博客功能的放到服務(wù)器A,儲(chǔ)存文件放到服務(wù)器B;

水平劃分------相同數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)不放在一張表里

把一個(gè)表的數(shù)據(jù)根據(jù)一定的規(guī)則劃分到不同的數(shù)據(jù)庫,兩個(gè)數(shù)據(jù)庫的表結(jié)構(gòu)一樣。

數(shù)據(jù)歸檔處理-----時(shí)間優(yōu)先原則存儲(chǔ)讀取

將數(shù)據(jù)庫中不經(jīng)常使用的數(shù)據(jù)遷移至近線設(shè)備,將長(zhǎng)期不使用的數(shù)據(jù)遷移至文件形式歸檔。這樣,隨著應(yīng)用的需要,數(shù)據(jù)會(huì)在在線、近線和文件文檔之間移動(dòng),如當(dāng)應(yīng)用需要訪問很久以前的某些數(shù)據(jù),它們的物理位置在近線設(shè)備,則會(huì)自動(dòng)移動(dòng)到在線設(shè)備。對(duì)用戶的應(yīng)用而言,這些都是透明的,就像所有數(shù)據(jù)都存放在在線設(shè)備一樣,不會(huì)對(duì)數(shù)據(jù)庫應(yīng)用產(chǎn)生任何影響。

Mysql某個(gè)表有近千萬數(shù)據(jù),CRUD比較慢,如何優(yōu)化?

數(shù)據(jù)千萬級(jí)別之多,占用的存儲(chǔ)空間也比較大,可想而知它不會(huì)存儲(chǔ)在一塊連續(xù)的物理空間上,而是鏈?zhǔn)酱鎯?chǔ)在多個(gè)碎片的物理空間上??赡軐?duì)于長(zhǎng)字符串的比較,就用更多的時(shí)間查找與比較,這就導(dǎo)致用更多的時(shí)間。

可以做表拆分,減少單表字段數(shù)量,優(yōu)化表結(jié)構(gòu)。

在保證主鍵有效的情況下,檢查主鍵索引的字段順序,使得查詢語句中條件的字段順序和主鍵索引的字段順序保持一致。

主要兩種拆分 垂直拆分,水平拆分。

垂直分表

也就是“大表拆小表”,基于列字段進(jìn)行的。一般是表中的字段較多,將不常用的, 數(shù)據(jù)較大,長(zhǎng)度較長(zhǎng)(比如text類型字段)的拆分到“擴(kuò)展表“。 一般是針對(duì) 那種 幾百列的大表,也避免查詢時(shí),數(shù)據(jù)量太大造成的“跨頁”問題。

垂直分庫針對(duì)的是一個(gè)系統(tǒng)中的不同業(yè)務(wù)進(jìn)行拆分,比如用戶User一個(gè)庫,商品Product一個(gè)庫,訂單Order一個(gè)庫。 切分后,要放在多個(gè)服務(wù)器上,而不是一個(gè)服務(wù)器上。為什么? 我們想象一下,一個(gè)購物網(wǎng)站對(duì)外提供服務(wù),會(huì)有用戶,商品,訂單等的CRUD。沒拆分之前, 全部都是落到單一的庫上的,這會(huì)讓數(shù)據(jù)庫的單庫處理能力成為瓶頸。按垂直分庫后,如果還是放在一個(gè)數(shù)據(jù)庫服務(wù)器上, 隨著用戶量增大,這會(huì)讓單個(gè)數(shù)據(jù)庫的處理能力成為瓶頸,還有單個(gè)服務(wù)器的磁盤空間,內(nèi)存,tps等非常吃緊。 所以我們要拆分到多個(gè)服務(wù)器上,這樣上面的問題都解決了,以后也不會(huì)面對(duì)單機(jī)資源問題。

數(shù)據(jù)庫業(yè)務(wù)層面的拆分,和服務(wù)的“治理”,“降級(jí)”機(jī)制類似,也能對(duì)不同業(yè)務(wù)的數(shù)據(jù)分別的進(jìn)行管理,維護(hù),監(jiān)控,擴(kuò)展等。 數(shù)據(jù)庫往往最容易成為應(yīng)用系統(tǒng)的瓶頸,而數(shù)據(jù)庫本身屬于“有狀態(tài)”的,相對(duì)于Web和應(yīng)用服務(wù)器來講,是比較難實(shí)現(xiàn)“橫向擴(kuò)展”的。 數(shù)據(jù)庫的連接資源比較寶貴且單機(jī)處理能力也有限,在高并發(fā)場(chǎng)景下,垂直分庫一定程度上能夠突破IO、連接數(shù)及單機(jī)硬件資源的瓶頸。

水平分表

針對(duì)數(shù)據(jù)量巨大的單張表(比如訂單表),按照某種規(guī)則(RANGE,HASH取模等),切分到多張表里面去。 但是這些表還是在同一個(gè)庫中,所以庫級(jí)別的數(shù)據(jù)庫操作還是有IO瓶頸。不建議采用。

水平分庫分表

將單張表的數(shù)據(jù)切分到多個(gè)服務(wù)器上去,每個(gè)服務(wù)器具有相應(yīng)的庫與表,只是表中數(shù)據(jù)集合不同。 水平分庫分表能夠有效的緩解單機(jī)和單庫的性能瓶頸和壓力,突破IO、連接數(shù)、硬件資源等的瓶頸。

水平分庫分表切分規(guī)則

1. RANGE

從0到10000一個(gè)表,10001到20000一個(gè)表;

2. HASH取模

一個(gè)商場(chǎng)系統(tǒng),一般都是將用戶,訂單作為主表,然后將和它們相關(guān)的作為附表,這樣不會(huì)造成跨庫事務(wù)之類的問題。 取用戶id,然后hash取模,分配到不同的數(shù)據(jù)庫上。

3. 地理區(qū)域

比如按照華東,華南,華北這樣來區(qū)分業(yè)務(wù),七牛云應(yīng)該就是如此。

4. 時(shí)間

按照時(shí)間切分,就是將6個(gè)月前,甚至一年前的數(shù)據(jù)切出去放到另外的一張表,因?yàn)殡S著時(shí)間流逝,這些表的數(shù)據(jù) 被查詢的概率變小,所以沒必要和“熱數(shù)據(jù)”放在一起,這個(gè)也是“冷熱數(shù)據(jù)分離”。

分庫分表后面臨的問題

事務(wù)支持

分庫分表后,就成了分布式事務(wù)了。如果依賴數(shù)據(jù)庫本身的分布式事務(wù)管理功能去執(zhí)行事務(wù),將付出高昂的性能代價(jià); 如果由應(yīng)用程序去協(xié)助控制,形成程序邏輯上的事務(wù),又會(huì)造成編程方面的負(fù)擔(dān)。

跨庫join

只要是進(jìn)行切分,跨節(jié)點(diǎn)Join的問題是不可避免的。但是良好的設(shè)計(jì)和切分卻可以減少此類情況的發(fā)生。解決這一問題的普遍做法是分兩次查詢實(shí)現(xiàn)。在第一次查詢的結(jié)果集中找出關(guān)聯(lián)數(shù)據(jù)的id,根據(jù)這些id發(fā)起第二次請(qǐng)求得到關(guān)聯(lián)數(shù)據(jù)。

跨節(jié)點(diǎn)的count,order by,group by以及聚合函數(shù)問題

這些是一類問題,因?yàn)樗鼈兌夹枰谌繑?shù)據(jù)集合進(jìn)行計(jì)算。多數(shù)的代理都不會(huì)自動(dòng)處理合并工作。解決方案:與解決跨節(jié)點(diǎn)join問題的類似,分別在各個(gè)節(jié)點(diǎn)上得到結(jié)果后在應(yīng)用程序端進(jìn)行合并。和join不同的是每個(gè)結(jié)點(diǎn)的查詢可以并行執(zhí)行,因此很多時(shí)候它的速度要比單一大表快很多。但如果結(jié)果集很大,對(duì)應(yīng)用程序內(nèi)存的消耗是一個(gè)問題。

數(shù)據(jù)遷移,容量規(guī)劃,擴(kuò)容等問題

來自淘寶綜合業(yè)務(wù)平臺(tái)團(tuán)隊(duì),它利用對(duì)2的倍數(shù)取余具有向前兼容的特性(如對(duì)4取余得1的數(shù)對(duì)2取余也是1)來分配數(shù)據(jù),避免了行級(jí)別的數(shù)據(jù)遷移,但是依然需要進(jìn)行表級(jí)別的遷移,同時(shí)對(duì)擴(kuò)容規(guī)模和分表數(shù)量都有限制??偟脕碚f,這些方案都不是十分的理想,多多少少都存在一些缺點(diǎn),這也從一個(gè)側(cè)面反映出了Sharding擴(kuò)容的難度。

ID問題

一旦數(shù)據(jù)庫被切分到多個(gè)物理結(jié)點(diǎn)上,我們將不能再依賴數(shù)據(jù)庫自身的主鍵生成機(jī)制。一方面,某個(gè)分區(qū)數(shù)據(jù)庫自生成的ID無法保證在全局上是唯一的;另一方面,應(yīng)用程序在插入數(shù)據(jù)之前需要先獲得ID,以便進(jìn)行SQL路由.

一些常見的主鍵生成策略

UUID

使用UUID作主鍵是最簡(jiǎn)單的方案,但是缺點(diǎn)也是非常明顯的。由于UUID非常的長(zhǎng),除占用大量存儲(chǔ)空間外,最主要的問題是在索引上,在建立索引和基于索引進(jìn)行查詢時(shí)都存在性能問題。

Twitter的分布式自增ID算法Snowflake

在分布式系統(tǒng)中,需要生成全局UID的場(chǎng)合還是比較多的,twitter的snowflake解決了這種需求,實(shí)現(xiàn)也還是很簡(jiǎn)單的,除去配置信息,核心代碼就是毫秒級(jí)時(shí)間41位 機(jī)器ID 10位 毫秒內(nèi)序列12位。

跨分片的排序分頁

一般來講,分頁時(shí)需要按照指定字段進(jìn)行排序。當(dāng)排序字段就是分片字段的時(shí)候,我們通過分片規(guī)則可以比較容易定位到指定的分片,而當(dāng)排序字段非分片字段的時(shí)候,情況就會(huì)變得比較復(fù)雜了。為了最終結(jié)果的準(zhǔn)確性,我們需要在不同的分片節(jié)點(diǎn)中將數(shù)據(jù)進(jìn)行排序并返回,并將不同分片返回的結(jié)果集進(jìn)行匯總和再次排序,最后再返回給用戶。

mysql對(duì)于大表(千萬級(jí)),要怎么優(yōu)化

第一優(yōu)化你的sql和索引;

第二加緩存,memcached,redis;

第三以上都做了后,還是慢,就做主從復(fù)制或主主復(fù)制,讀寫分離,可以在應(yīng)用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要么效率不高,要么沒人維護(hù);

第四如果以上都做了還是慢,不要想著去做切分,mysql自帶分區(qū)表,先試試這個(gè),對(duì)你的應(yīng)用是透明的,無需更改代碼,但是sql語句是需要針對(duì)分區(qū)表做優(yōu)化的,sql條件中要帶上分區(qū)條件的列,從而使查詢定位到少量的分區(qū)上,否則就會(huì)掃描全部分區(qū),另外分區(qū)表還有一些坑,在這里就不多說了;

第五如果以上都做了,那就先做垂直拆分,其實(shí)就是根據(jù)你模塊的耦合度,將一個(gè)大的系統(tǒng)分為多個(gè)小的系統(tǒng),也就是分布式系統(tǒng);

第六水平切分,針對(duì)數(shù)據(jù)量大的表,這一步最麻煩,最能考驗(yàn)技術(shù)水平,要選擇一個(gè)合理的sharding key,為了有好的查詢效率,表結(jié)構(gòu)也要改動(dòng),做一定的冗余,應(yīng)用也要改,sql中盡量帶sharding key,將數(shù)據(jù)定位到限定的表上去查,而不是掃描全部的表;

文章題目:mysql大表怎么優(yōu)化 mysql大表優(yōu)化的常用方案
網(wǎng)站路徑:http://muchs.cn/article28/hheccp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、虛擬主機(jī)微信公眾號(hào)、軟件開發(fā)、網(wǎng)站排名、關(guān)鍵詞優(yōu)化

廣告

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

成都app開發(fā)公司