Mysql資料庫進階之(分表分庫,主從分離)
阿新 • • 發佈:2018-12-25
前言:資料庫的優化是一個程式設計師的分水嶺,作為小白我也得去提前學習這方面的資料的
(一) 三正規化和逆正規化
聽起正規化這個遲非常專業我來舉個簡單的栗子:
第一正規化就是: 把能夠關聯的每條資料都拆分成一個表
第二正規化就是:把能夠關聯的每條資料寫在一個表格中去
第三正規化就是:把一些重複的欄位再劃分多一個表來存(這樣做查詢資料時候只能連表來操作)給查詢帶來壓力
逆正規化就是:寧願犧牲一些冗餘的資料把所有的欄位都往一個表格裡面存,這樣有利於提高查詢速度.
(二)垂直分表和水平分表設計
1.水平分表
create table cakes ( id int unsigned primarykey auto_increment, cakename varchar(16) )charset=utf8 partition by range(id)( #分表名稱cake1000,範圍是id=1 to id=999 partition cake1000 values less than(1000), #分表名稱cake1000,範圍是id=1000 to id=1999 partition cake2000 values less than(2000) );
說明這裡通過id標識來分表,主要表格的id如果超過了規定的值就會進入下一個表格
//這個功能主要是用在表格已經生成了但是後面新增的alter table 表名 add partition ( partition 分表名稱 values less than (範圍) )
//刪除分表的功能
alter table 表名 drop partition 分表名稱;
2.垂直分表
create table goods ( id int unsigned comment '不能在list分表使用索引', proname varchar(10) not null, source varchar(20) comment '原料', `money` varchar(10) not null, addtime datetime not null comment '2018-03-25 11:22:33' )charset=utf8 partition by list( month(addtime) )( partition spring values in(3,4,5), #春季 partition summer values in(6,7,8), #夏季 partition autumn values in(9,10,11), #秋季 partition winter values in(12,1,2) #冬季 );
//注意這裡是以月份進行分表的,並且id這個欄位不能為主鍵和唯一鍵索引
//這個功能主要是用在表格已經生成了但是後面新增的
alter table 表名 add partition (
partition 分表名稱 values in (範圍)
)
create index normal_id on goodsYear(id); //通常都是以普通鍵索引來做為ID
alter table 表名 drop partition 分表名稱;
(三)
如果希望當前伺服器被其他伺服器訪問就需要使用 Grant 使用者授權技術 //授權語句 GRANT ALL PRIVILEGES ON *.* TO '授權使用者名稱'@'被授權伺服器的IP' IDENTIFIED BY '授權密碼'; //立即生效 FLUSH PRIVILEGES;
//如果授權成功效果,通過命令檢視mysql中的系統使用者表:
select host,user from mysql.user where user=授權使用者名稱
//測試是否能在別的伺服器訪問本伺服器的資料庫
mysql -u授權的使用者名稱 -p授權的密碼 -h訪問的主機
(四)
-
-
show master status : 該函式主要檢視用於Master資料庫正在使用的binlog日誌情況
-
show slave status \G: 該函式主要用於Slave資料庫是否已經同步
以上函式如果不用於主從複製和讀寫分離的配置當中,等同沒用
(五)讀寫分離和主從複製
1.主從首要條件:①關閉 selinux ②關閉 iptables ③ master 已經對 slave 進行 grant 授權
create database php32 charset utf8; 在 master 伺服器中開啟 binlog 日誌和設定要發生主從同步資料庫(my.cnf) #mysql的bin-log 日誌配置選項,假設 做讀寫(主從)分離,這個選項在從伺服器必須關閉 log-bin=mysql-bin #1.主伺服器的id,這個 id 不一定設為 1,只要主從不一樣就行 server-id=1 #2.要做同步的資料庫名字,可以是多個數據庫,之間用分號分割 binlog-do-db=php32
#3.儲存重啟mysql
service mysqld restart
#4.顯示狀態(裡面顯示的資料用在從伺服器使用)
show master status;
#從伺服器
servir-id = 2 (這裡只要和主伺服器不同就行了)
#登入
mysql -uxxx -pxxx
#認證從伺服器
change master to master_host='主伺服器的IP地址',
master_port=3306,#埠
master_user='xxx',#主伺服器授權的使用者名稱
master_password='xxx',#主伺服器授權的使用者密碼
master_log_file='mysql-bin.000007',#主伺服器上的bin-log日誌
master_log_pos=106;#主伺服器上的 bin-log日誌值
#啟動主從服務
start slave;
#登入slave伺服器中,檢視show slave status\G,看到如下選項代表主從複製同步成功:
show slave status\G
最後注意:如果開發中寫的操作發生slave當中,主從同步馬上宣告失敗,因此開發中,我們必須清楚 master 和 slave 伺服器,slave 我們只是讓它負責 select,但是 slave 是可以 insert 資料的,但是清楚風險所在.