天天看點

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

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

例:

訂單表根據訂單産生時間來分表(一年一張)

學生情況表

查詢電話費,近三個月的資料放入一張表,一年内的放入到另一張表

有些表記錄數并不多,可能也就2、3萬條,但是字段卻很長,表占用空間很大,檢索表時需要執行大量I/O,嚴重降低了性能。這個時候需要把大的字段拆分到另一個表,并且該表與原表是一對一的關系。 (JOIN)        

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

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

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

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

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

資料庫隻存儲路徑。圖檔和檔案存放在檔案系統,甚至單獨放在一台伺服器(圖床 / 視訊伺服器 ).

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

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

在my.ini修改端口3306,預設存儲引擎和最大連接配接數

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

讀寫分離

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

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

Master

Slave1

Slave2

Slave3

    主庫master用來寫入,slave1—slave3都用來做select,每個資料庫分擔的壓力小了很多。

要實作這種方式,需要程式特别設計,寫都操作master,讀都操作slave,給程式開發帶來了額外負擔。當然目前已經有中間件來實作這個代理,對程 序來讀寫哪些資料庫是透明的。官方有個mysql-proxy,但是還是alpha版本的。新浪有個amobe for mysql,也可達到這個目的,結構如下 

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

在G:\Database目錄下面建立目錄mysqlbinlog

2、重新開機mysql服務

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

mylog.000001:日志備份檔案。如果要檢視這個日志檔案裡面的資訊,我們可以使用mysqlbinlog程式檢視,mysqlbinlog程式存放在mysql的bin目錄下面(“C:\Program Files\MySQL\MySQL Server 5.6\bin”)。

執行sql語句

開始——運作——cmd,mysqlbinlog 備份檔案路徑

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

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語句檢視

結果變成了

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

按位置來恢複

執行cmd指令:mysqlbinlog --stop-position="614" G:\Database\mysqlbinlog\mylog.000001 | mysql -uroot -p

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

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

本文轉自鄒瓊俊部落格園部落格,原文連結:http://www.cnblogs.com/jiekzou/p/5399160.html,如需轉載請自行聯系原作者