你好!如果有大量的訪問(wèn)用到調(diào)取到數(shù)據(jù)庫(kù)時(shí),往往查詢速度會(huì)變得很慢,所以我們需要進(jìn)行優(yōu)化處理。
優(yōu)化從三個(gè)方面考慮:
SQL語(yǔ)句優(yōu)化、
主從復(fù)制,讀寫分離,負(fù)載均衡、
數(shù)據(jù)庫(kù)分庫(kù)分表。
一、SQL查詢語(yǔ)句優(yōu)化
1、使用索引
建立索引可以使查詢速度得到提升,我們首先應(yīng)該考慮在where及orderby,groupby涉及的列上建立索引。
2、借助explain(查詢優(yōu)化神器)選擇更好的索引和優(yōu)化查詢語(yǔ)句
SQL的Explain通過(guò)圖形化或基于文本的方式詳細(xì)說(shuō)明了SQL語(yǔ)句的每個(gè)部分是如何執(zhí)行以及何時(shí)執(zhí)行的,以及執(zhí)行效果。通過(guò)對(duì)選擇更好的索引列,或者對(duì)耗時(shí)久的SQL語(yǔ)句進(jìn)行優(yōu)化達(dá)到對(duì)查詢速度的優(yōu)化。
3、任何地方都不要使用SELECT*FROM語(yǔ)句。
4、不要在索引列做運(yùn)算或者使用函數(shù)
5、查詢盡可能使用limit來(lái)減少返回的行數(shù)
6、使用查詢緩存,并將盡量多的內(nèi)存分配給MYSQL做緩存
二、主從復(fù)制,讀寫分離,負(fù)載均衡
目前大多數(shù)的主流關(guān)系型數(shù)據(jù)庫(kù)都提供了主從復(fù)制的功能,通過(guò)配置兩臺(tái)(或多臺(tái))數(shù)據(jù)庫(kù)的主從關(guān)系,可以將一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的數(shù)據(jù)更新同步到另一臺(tái)服務(wù)器上。網(wǎng)站可以利用數(shù)據(jù)庫(kù)這一功能,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫分離,從而改善數(shù)據(jù)庫(kù)的負(fù)載壓力。一個(gè)系統(tǒng)的讀操作遠(yuǎn)遠(yuǎn)多于寫操作,因此寫操作發(fā)向master,讀操作發(fā)向slaves進(jìn)行操作(簡(jiǎn)單的輪詢算法來(lái)決定使用哪個(gè)slave)。
利用數(shù)據(jù)庫(kù)的讀寫分離,Web服務(wù)器在寫數(shù)據(jù)的時(shí)候,訪問(wèn)主數(shù)據(jù)庫(kù)(master),主數(shù)據(jù)庫(kù)通過(guò)主從復(fù)制將數(shù)據(jù)更新同步到從數(shù)據(jù)庫(kù)(slave),這樣當(dāng)Web服務(wù)器讀數(shù)據(jù)的時(shí)候,就可以通過(guò)從數(shù)據(jù)庫(kù)獲得數(shù)據(jù)。這一方案使得在大量讀操作的Web應(yīng)用可以輕松地讀取數(shù)據(jù),而主數(shù)據(jù)庫(kù)也只會(huì)承受少量的寫入操作,還可以實(shí)現(xiàn)數(shù)據(jù)熱備份,可謂是一舉兩得。
三、數(shù)據(jù)庫(kù)分表、分區(qū)、分庫(kù)
1、分表
通過(guò)分表可以提高表的訪問(wèn)效率。有兩種拆分方法:
垂直拆分
在主鍵和一些列放在一個(gè)表中,然后把主鍵和另外的列放在另一個(gè)表中。如果一個(gè)表中某些列常用,而另外一些不常用,則可以采用垂直拆分。
水平拆分
根據(jù)一列或者多列數(shù)據(jù)的值把數(shù)據(jù)行放到兩個(gè)獨(dú)立的表中。
2、分區(qū)
分區(qū)就是把一張表的數(shù)據(jù)分成多個(gè)區(qū)塊,這些區(qū)塊可以在一個(gè)磁盤上,也可以在不同的磁盤上,分區(qū)后,表面上還是一張表,但是數(shù)據(jù)散列在多個(gè)位置,這樣一來(lái),多塊硬盤同時(shí)處理不同的請(qǐng)求,從而提高磁盤I/O讀寫性能。實(shí)現(xiàn)比較簡(jiǎn)單,包括水平分區(qū)和垂直分區(qū)。
3、分庫(kù)
分庫(kù)是根據(jù)業(yè)務(wù)不同把相關(guān)的表切分到不同的數(shù)據(jù)庫(kù)中,比如web、bbs、blog等庫(kù)。
分庫(kù)解決的是數(shù)據(jù)庫(kù)端并發(fā)量的問(wèn)題。分庫(kù)和分表并不一定兩個(gè)都要上,比如數(shù)據(jù)量很大,但是訪問(wèn)的用戶很少,我們就可以只使用分表不使用分庫(kù)。如果數(shù)據(jù)量只有1萬(wàn),而訪問(wèn)用戶有一千,那就只使用分庫(kù)。
注意:分庫(kù)分表最難解決的問(wèn)題是統(tǒng)計(jì),還有跨表的連接(比如這個(gè)表的訂單在另外一張表),解決這個(gè)的方法就是使用中間件,比如大名鼎鼎的MyCat,用它來(lái)做路由,管理整個(gè)分庫(kù)分表,乃至跨庫(kù)跨表的連接