Mysql效能優化三(分表 增量備份 還原)

2021-09-08 11:47:21 字數 4010 閱讀 7790

接上篇mysql效能優化二

如果乙個表的記錄數太多了,比如上千萬條,而且需要經常檢索,那麼我們就有必要化整為零了。如果我拆成100個表,那麼每個表只有10萬條記錄。當然這需要資料在邏輯上可以劃分。乙個好的劃分依據,有利於程式的簡單實現,也可以充分利用水平分表的優勢。比如系統介面上只提供按月查詢的功能,那麼把錶按月拆分成12個,每個查詢只查詢乙個表就夠了。如果非要按照地域來分,即使把錶拆的再小,查詢還是要聯合所有表來查,還不如不拆了。所以乙個好的拆分依據是 最重要的。關鍵字:union

例:有些表記錄數並不多,可能也就2、3萬條,但是欄位卻很長,表占用空間很大,檢索表時需要執行大量i/o,嚴重降低了效能。這個時候需要把大的字段拆分到另乙個表,並且該錶與原表是一對一的關係。 (join)        

【試題內容】、【答案資訊】兩個表,最初是作為幾個字段新增到【試題資訊】裡的,可以看到試題內容和答案這兩個欄位很長,在表裡有3萬記錄時,表已經佔 了1g的空間,在列試題列表時非常慢。經過分析,發現系統很多時候是根據【冊】、【單元】、型別、類別、難易程度等查詢條件,分頁顯示試題詳細內容。而每 次檢索都是這幾個表做join,每次要掃瞄一遍1g的表。我們完全可以把內容和答案拆分成另乙個表,只有顯示詳細內容的時候才讀這個大表,由此 就產生了【試題內容】、【答案資訊】兩個表。

選擇欄位的一般原則是保小不保大,能用占用位元組小的字段就不用大字段。比如主鍵, 建議使用自增型別,這樣省空間,空間就是效率!按4個位元組和按32個位元組定位一條記錄,誰快誰慢太明顯了。涉及到幾個表做join時,效果就更明顯了。

建議使用乙個不含業務邏輯的id做主角如s1001。例:

int

4bigint

8 mediumint smallint

2tinyint

1md5

char(32

)id :整數

tinyint samllint int

bigint

student表

id stuno stuname adress

1 s1001 小民 深圳

最重要的引數就是記憶體,我們主要用的innodb引擎,所以下面兩個引數調的很大

innodb_additional_mem_pool_size =64m

innodb_buffer_pool_size =1g

對於myisam,需要調整key_buffer_size,當然調整引數還是要看狀態,用show status語句可以看到當前狀態,以決定改調整哪些引數

在my.ini修改埠3306,預設儲存引擎和最大連線數

在my.ini中.

port=3306 [有兩個地方修改]

default-storage-engine=innodb

max_connections=100

如果你的機器記憶體超過4g,那麼毋庸置疑應當採用64位作業系統和64位mysql 5.5.19 or mysql5.6

讀寫分離

如果資料庫壓力很大,一台機器支撐不了,那麼可以用mysql複製實現多台機器同步,將資料庫的壓力分散。

專案實際需求,請完成定時備份某個資料庫,或者定時備份資料庫的某些表的操作

windows 下每隔1小時,備份一次資料newsdb

windows 每天晚上2:00   備份 newsdb 下 某一張表

cmd> mysqldump –u root –p密碼  資料庫名 > 把資料庫放入到某個目錄

案例,備份 mydb 庫的所有表

進入mysqldump所在的目錄

cmd> mysqldump –u root –phsp shop> d:/shop.log   [把shop資料庫的所有表全部匯出]

cmd> mysqldump –u root –phsp shop temusers emp > d:/shop2.log [shop資料庫的 temusers和emp匯出]

如何恢復資料的表

進入的mysql操作介面

mysql>source  備份檔案的全路徑

定時備份:(把命令寫入到my.bat 問中)

windows 如何定時備份 (每天凌晨2:00)

使用windows自帶的計畫任務,定時執行批處理命令。

定義:mysql資料庫會以二進位制的形式,自動把使用者對mysql資料庫的操作,記錄到檔案,當使用者希望恢復的時候,可以使用備份檔案進行恢復。

增量備份會記錄dml語句、建立表的語句,不會記錄select。記錄的東西包括:sql語句本身、操作時間,位置

進行增量備份的步驟和恢復

注意:mysql5.0及之前的版本是不支援增量備份的

1、配置my.ini檔案或者my.conf,啟用二進位製備份。

開啟my.ini檔案,查詢log-bin,進行配置:log-bin=g:\database\mysqlbinlog\mylog

如果是5.7還要進行配置:binlog_format=mixed

在g:\database目錄下面新建目錄mysqlbinlog

2、重啟mysql服務

這個時候會在mysqlbinlog目錄下面看到以下兩個檔案:

mylog.000001:日誌備份檔案。如果要檢視這個日誌檔案裡面的資訊,我們可以使用mysqlbinlog程式檢視,mysqlbinlog程式存放在mysql的bin目錄下面(「c:\program files\mysql\mysql server 5.6\bin」)。

執行sql語句

update emp set ename=

'zou**

'where empno=

100003;

開始——執行——cmd,mysqlbinlog 備份檔案路徑

mylog.index:日誌索引檔案,裡面記錄了所以的日誌檔案。(g:\database\mysqlbinlog\mylog.000001)

3、假設現在問題來了,我這條update是誤操作,如何進行恢復

在mysql日誌中會記錄每一次操作的時間和位置,所以我們既可以根據時間來恢復,也可以根據位置來恢復。

那麼,我們現在馬上可以從上圖看出,這條語句產生的時間是"2016-04-17 12:01:36",位置是614

按時間來恢復

我們可以選擇在語句產生時間的前一秒

執行cmd命令:mysqlbinlog --stop-datetime="2016-04-17 12:01:35" g:\database\mysqlbinlog\mylog.000001 | mysql -uroot -p

這個時候我再執行sql語句檢視

select

*from emp where empno=

100003;

結果變成了

按位置來恢復

執行cmd命令:mysqlbinlog --stop-position="614" g:\database\mysqlbinlog\mylog.000001 | mysql -uroot -p

這個時候再執行sql來檢視結果,又變回來了。

三分鐘筆記 效能優化小筆記

1 雪碧圖 多張類似或大小統一的合成一張大的,通過絕對定位background的相關屬性設定展示的區域 懶載入 縮圖 我們一般用把上傳在oss,有乙個單獨的網域名稱,的網域名稱跟展示專案是在不用網域名稱下,分擔了資源請求 x oss process image auto orient,1 resiz...

mysql建表效能優化 MYSQL建表優化

除非單錶資料未來會一直不斷 否則不要一開始就考慮拆分,拆分會帶來邏輯 部署 運維的各種複雜度,一般以整型值為主的表在千萬級以下,字串為主的表在五百萬以下是沒有太大問題的。1 字段 a 盡量使用tinyint smallint medium int作為整數型別而非int,如果非負則加上unsigned...

mysql效能優化總結 三

mysql體系結構 外掛程式式儲存引擎,將資料的查詢和儲存相分離.每一款儲存引擎都有各自的優缺點.可以靈活選用 架構 客戶端 mysql服務層 儲存引擎層 儲存引擎是針對表,不是針對庫,同一庫中的不同的表,可以使用不同的儲存引擎.但是不建議這樣做 儲存引擎的不同會對效能產生直接的影響.mysql常用...