接上篇Mysql性能優化二html
若是一個表的記錄數太多了,好比上千萬條,並且須要常常檢索,那麼咱們就有必要化整爲零了。若是我拆成100個表,那麼每一個表只有10萬條記錄。固然這須要數據在邏輯上能夠劃分。一個好的劃分依據,有利於程序的簡單實現,也能夠充分利用水平分表的優點。好比系統界面上只提供按月查詢的功能,那麼把表按月拆分紅12個,每一個查詢只查詢一個表就夠了。若是非要按照地域來分,即便把表拆的再小,查詢仍是要聯合全部表來查,還不如不拆了。因此一個好的拆分依據是 最重要的。關鍵字:UNION
例:mysql
有些表記錄數並很少,可能也就二、3萬條,可是字段卻很長,表佔用空間很大,檢索表時須要執行大量I/O,嚴重下降了性能。這個時候須要把大的字段拆分到另外一個表,而且該表與原表是一對一的關係。 (JOIN) sql
【試題內容】、【答案信息】兩個表,最初是做爲幾個字段添加到【試題信息】裏的,能夠看到試題內容和答案這兩個字段很長,在表裏有3萬記錄時,表已經佔 了1G的空間,在列試題列表時很是慢。通過分析,發現系統不少時候是根據【冊】、【單元】、類型、類別、難易程度等查詢條件,分頁顯示試題詳細內容。而每 次檢索都是這幾個表作join,每次要掃描一遍1G的表。咱們徹底能夠把內容和答案拆分紅另外一個表,只有顯示詳細內容的時候纔讀這個大表,由此 就產生了【試題內容】、【答案信息】兩個表。 數據庫
選擇字段的通常原則是保小不保大,能用佔用字節小的字段就不用大字段。好比主鍵, 建議使用自增類型,這樣省空間,空間就是效率!按4個字節和按32個字節定位一條記錄,誰快誰慢太明顯了。涉及到幾個表作join時,效果就更明顯了。
建議使用一個不含業務邏輯的id作主角如s1001。例:windows
int 4 bigint 8 mediumint smallint 2 tinyint 1 md5 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,默認存儲引擎和最大鏈接數post
在my.ini中.
port=3306 [有兩個地方修改]
default-storage-engine=INNODB
max_connections=100
若是你的機器內存超過4G,那麼毋庸置疑應當採用64位操做系統和64位mysql 5.5.19 or mysql5.6
讀寫分離
若是數據庫壓力很大,一臺機器支撐不了,那麼能夠用mysql複製實現多臺機器同步,將數據庫的壓力分散。
性能
Master
Slave1
Slave2
Slave3
主庫master用來寫入,slave1—slave3都用來作select,每一個數據庫分擔的壓力小了不少。
要實現這種方式,須要程序特別設計,寫都操做master,讀都操做slave,給程序開發帶來了額外負擔。固然目前已經有中間件來實現這個代理,對程 序來讀寫哪些數據庫是透明的。官方有個mysql-proxy,可是仍是alpha版本的。新浪有個amobe for 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及以前的版本是不支持增量備份的
一、配置my.ini文件或者my.conf,啓用二進制備份。
打開my.ini文件,查找log-bin,進行配置:log-bin=G:\Database\mysqlbinlog\mylog
若是是5.7還要進行配置:binlog_format=mixed
在G:\Database目錄下面新建目錄mysqlbinlog
二、重啓mysql服務
這個時候會在mysqlbinlog目錄下面看到如下兩個文件:
mylog.000001:日誌備份文件。若是要查看這個日誌文件裏面的信息,咱們可使用mysqlbinlog程序查看,mysqlbinlog程序存放在mysql的bin目錄下面(「C:\Program Files\MySQL\MySQL Server 5.6\bin」)。
執行sql語句
UPDATE emp set ename='zouqj' where empno=100003;
開始——運行——cmd,mysqlbinlog 備份文件路徑
C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqlbinlog G:\Database\mysqlbinlog\mylog.000001
mylog.index:日誌索引文件,裏面記錄了因此的日誌文件。(G:\Database\mysqlbinlog\mylog.000001)
三、假設如今問題來了,我這條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來查看結果,又變回來了。