1. 程式人生 > >資料庫訪問量很大時,如何做優化?

資料庫訪問量很大時,如何做優化?

       如果有一個特別大的訪問量到資料庫上時,往往查詢速度會變得很慢,所以我們需要進行優化。優化從三個方面考慮:SQL語句優化、主從複製,讀寫分離,負載均衡、資料庫分庫分表。

一、SQL查詢語句優化

    1、使用索引

    建立索引可以使查詢速度得到提升,我們首先應該考慮在where及order by,group by涉及的列上建立索引。

   2、藉助explain(查詢優化神器)選擇更好的索引和優化查詢語句

    SQL 的 Explain 通過圖形化或基於文字的方式詳細說明了 SQL 語句的每個部分是如何執行以及何時執行的,以及執行效果。通過

對選擇更好的索引列,或者對耗時久的SQL語句進行優化達到對查詢速度的優化。

   3、任何地方都不要使用SELECT * FROM語句。

   4、不要在索引列做運算或者使用函式

   5、查詢儘可能使用limit來減少返回的行數

   6、使用查詢快取,並將儘量多的記憶體分配給MYSQL做快取

二、主從複製,讀寫分離,負載均衡

   目前大多數的主流關係型資料庫都提供了主從複製的功能,通過配置兩臺(或多臺)資料庫的主從關係,可以將一臺資料庫伺服器的資料更新同步到另一臺伺服器上。網站可以利用資料庫這一功能,實現資料庫的讀寫分離,從而改善資料庫的負載壓力。一個系統的讀操作遠遠多於寫操作,因此寫操作發向master,讀操作發向slaves進行操作(簡單的輪詢演算法來決定使用哪個slave)。

   利用資料庫的讀寫分離,Web伺服器在寫資料的時候,訪問主資料庫(master),主資料庫通過主從複製將資料更新同步到從資料庫(slave),這樣當Web伺服器讀資料的時候,就可以通過從資料庫獲得資料。這一方案使得在大量讀操作的Web應用可以輕鬆地讀取資料,而主資料庫也只會承受少量的寫入操作,還可以實現資料熱備份,可謂是一舉兩得。

三、資料庫分表、分割槽、分庫

   1、分表

   通過分表可以提高表的訪問效率。有兩種拆分方法:

   垂直拆分

   在主鍵和一些列放在一個表中,然後把主鍵和另外的列放在另一個表中。如果一個表中某些列常用,而另外一些不常用,則可以採用垂直拆分。

   水平拆分

   根據一列或者多列資料的值把資料行放到兩個獨立的表中。

   2、分割槽

   分割槽就是把一張表的資料分成多個區塊,這些區塊可以在一個磁碟上,也可以在不同的磁碟上,分割槽後,表面上還是一張表,但是資料雜湊在多個位置,這樣一來,多塊硬碟同時處理不同的請求,從而提高磁碟I/O讀寫效能。實現比較簡單,包括水平分割槽和垂直分割槽。

   3、分庫

   分庫是根據業務不同把相關的表切分到不同的資料庫中,比如web、bbs、blog等庫。

  分庫解決的是資料庫端 併發量的問題。分庫和分表並不一定兩個都要上,比如資料量很大,但是訪問的使用者很少,我們就可以只使用分表不使用分庫。如果資料量只有1萬,而訪問使用者有一千,那就只使用分庫。  

  注意:分庫分表最難解決的問題是統計,還有跨表的連線(比如這個表的訂單在另外一張表),解決這個的方法就是使用中介軟體,比如大名鼎鼎的MyCat,用它來做路由,管理整個分庫分表,乃至跨庫跨表的連線

    

相關推薦

資料庫訪問量如何優化

       如果有一個特別大的訪問量到資料庫上時,往往查詢速度會變得很慢,所以我們需要進行優化。優化從三個方面考慮:SQL語句優化、主從複製,讀寫分離,負載均衡、資料庫分庫分表。一、SQL查詢語句優化    1、使用索引    建立索引可以使查詢速度得到提升,我們首先應該考

斯坦福大學公開課機器學習:machine learning system design | data for machine learning(數據量學習算法表現比較好的原理)

ali 很多 好的 info 可能 斯坦福大學公開課 數據 div http 下圖為四種不同算法應用在不同大小數據量時的表現,可以看出,隨著數據量的增大,算法的表現趨於接近。即不管多麽糟糕的算法,數據量非常大的時候,算法表現也可以很好。 數據量很大時,學習算法表現比

快速冪取模(當數相乘long long也會超出的解決辦法)

結合 超出 但是 long 數字 也會 連續 return result 當幾個數連續乘最後取模時,可以將每個數字先取模,最後再取模,即%對於*具有結合律。但是如果當用來取模的數本身就很大,采取上述方法就不行了。這個時候可以借鑒快速冪取模的方法,來達到大數相乘取模的效果。

日誌檔案用grep + sed

工作涉及到排查歷史問題,日誌一堆,linux命令功能強大,很快定位 1、grep grep -ano "查詢關鍵字"  ./* 顯示出檔案,以及所在行號 2、然後再用sed sed -n 100,200p ./logfile 100,200p 表示列印100,200行

Excel表格太怎麼列印到同一頁?這樣三秒鐘搞定!

Excel表格太大時,怎麼列印到同一頁?教你一招輕鬆搞定! Excel列印必備技巧:表格再大,也能將Excel內容列印在同一頁 Excel表格太大,怎麼列印到同一頁,一直是困擾大家的一個問題,如果找不到解決方法,確實比較麻煩,畢竟職場中需要經常跟Excel打交道。 小編今天就來教大家,當

swiper裏面的tab切換不同的slide高度不一樣外層高度何如隨之改變如果裏面的每一屏的高度不一樣那麽就會一直以高度最的一個座位最外層的高度總成了頁面內容少的那一頁有很大空白改如何動態改變外層的高度呢

ide設置 就會 否則 location translate dir 最大的 ext 如果 解決方案:1.autoHeight: true;缺點:有明顯的跳動效果2.先給容器設固定高度,每次滑動多少時,改變當前tab頁的容器高度,我在實現是遇到一點小問題,代碼忘記保存了。

求較整數n的階乘因為n較n的階乘超出了正常類型的表示範圍可以采用數組進行操作(c實現)

c語言 n階乘下面鏈接是java的實現,思路叫清晰點http://blog.51cto.com/6631065/2044441 #include <stdio.h> void Print_Factorial ( const int N ); int main() { int N; sc

圖片過前端如何優化載入

一、 採用不減解析度的壓縮方式進行壓縮 用PS開啟圖片,點選點選“檔案”——“儲存為Web所用格式” 將圖片儲存為Web所用格式,點選“儲存”。 或者尋找第三方壓縮方式https://tinypng.com/ 二、將圖片改為jpeg漸進式圖片 上圖是標準型jpg格式的

Batch Size設定過對神經網路效能的影響情況

之前的一片博文寫了Batch Size的作用和應該如何設定比較合適,同時還有Batch Size大小,與學習率 lr l r lr、訓練次數 epoch

delphi資料庫進行增加操作怎麼判斷插入的這個值是否已經存在?

//增 procedure TForm1.btnAddClick(Sender: TObject); begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from AZZ whe

vue專案打包後文件過怎麼辦如何優化載入速度

路由懶載入 const Home = () => import('./views/Home.vue'); const MyInfo = () => import('./views/MyInfo.vue'); 在.babelrc中 "plugins": ["@babe

java mybatis 關於中向資料庫中插入資料報錯java.lang.NullPointerException的問題

今天在實現向MySQL的資料庫insert一個Object資料時出現一個錯誤; org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptio

問題描述: 在使用mybatis對資料庫執行更新操作parameterType為某個具體的bean而bean中傳入的引數為null丟擲異常如下:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mappin

資料庫儲存為null自定義字元標識。使轉為json資料後列不丟失或有undefined。

當查詢的資料中,列mno為空時,用“-”代替,也可以用中文之類代替,比如“暫空”,這裡採用“-”代替。 只需要在sql語句新增IFNULL(m.mno,’-‘) AS mno進行處理即可,例如: SELECT IFNULL(m.mflighno,'-') AS mflighno,m.*

當未來比特幣交易資料非常普通使用者節點該怎麼辦

一、可擴充套件的支付驗證網路        現在安裝一個比特幣完整的節點錢包,總共需要大概100G左右的硬碟空間,計算方法為每一個區塊的大小為1M左右,乘以現在的總區塊數目就是完整節點的大小了;區塊鏈的區塊是一直都會增加的,意味著全節點的大小也會無止境的增長。    在未來由

關於java中向資料庫中插入資料報錯Caused by: java.lang.NullPointerException的問題

今天在實現一個update資料時出現一個錯誤; org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

今天有成效程式碼優化效能提高了近10倍

beanutil的效能是我們的系統的效能瓶頸,雖然,我們的平臺已經固化,我們只能不改變現有結構的方式下進行優化,但是,優化的空間還是很大的。經過優化,我們的系統性能提高超過了一倍。 這是我們優化前和優化後的執行效率比較 (優化前方法buildVO佔據了整個請求的59.6%

】phpMyAdmin中匯入mysql資料庫檔案出錯:您可能正在上傳的檔案請參考文件來尋找解決辦法

用phpMyAdmin去匯入90M左右的mysql資料庫檔案時出錯: 您可能正在上傳很大的檔案,請參考 文件 來尋找解決方法。 【解決過程】 1.很明顯,是檔案太大,無法匯入。即上傳檔案大小有限制。 所以要去解除此限制。 之前其實也遇到類似的問題,之前就解決了

在海思hi3516C上面流媒體rtsp server總是存在延並且VLC播放丟幀

丟幀是VLC報出來的,如下: 我將幀率設定為15,而且是CIF解析度,區域網傳輸,不應該有丟幀啊!?我XX 查了一整天,各種辦法,最後我發現是海思SDK送出來PTS有問題: pts=pstStream->pstPack[i].u64PTS*90/100

資料庫匯入資料資料量導致報錯問題

當資料庫匯入資料時,資料量很大容易導致一些問題 在mysql安裝目錄下,找到my.ini檔案,開啟此檔案在最下面加入以下一段程式碼: wait_timeout=2880000 interactive_timeout =2880000 max_allowed_packet=1