1. 程式人生 > >Mysql資料庫進階之(分表分庫,主從分離)

Mysql資料庫進階之(分表分庫,主從分離)

前言:資料庫的優化是一個程式設計師的分水嶺,作為小白我也得去提前學習這方面的資料的

(一)  三正規化和逆正規化

  聽起正規化這個遲非常專業我來舉個簡單的栗子:

  第一正規化就是:  把能夠關聯的每條資料都拆分成一個表

  第二正規化就是:把能夠關聯的每條資料寫在一個表格中去

  第三正規化就是:把一些重複的欄位再劃分多一個表來存(這樣做查詢資料時候只能連表來操作)給查詢帶來壓力

 

  逆正規化就是:寧願犧牲一些冗餘的資料把所有的欄位都往一個表格裡面存,這樣有利於提高查詢速度.

(二)垂直分表和水平分表設計

  1.水平分表


create table cakes ( id int unsigned primary
key 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 分表名稱;

 

(三) MySQL 的 Grant 使用者授權

  即:在 MySQL 中預設存在一個本地使用者訪問的機制,其他伺服器是無法訪問的另一臺伺服器的MySQL 資料庫,是會報沒有許可權的

如果希望當前伺服器被其他伺服器訪問就需要使用 Grant 使用者授權技術
//授權語句
GRANT ALL PRIVILEGES ON *.* TO '授權使用者名稱'@'被授權伺服器的IP' IDENTIFIED BY '授權密碼';
//立即生效
FLUSH PRIVILEGES;
//如果授權成功效果,通過命令檢視mysql中的系統使用者表:
select host,user from mysql.user where user=授權使用者名稱
//測試是否能在別的伺服器訪問本伺服器的資料庫
mysql -u授權的使用者名稱 -p授權的密碼 -h訪問的主機

 

(四)binlog 日誌

  1. show variables like 'log_bin' : 該函式主要用於檢視binlog日誌是否已經開啟

  2. show master status : 該函式主要檢視用於Master資料庫正在使用的binlog日誌情況

  3. 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;
stop slave; -- 停止
reset slave; -- 重置
start slave; -- 啟動

#登入slave伺服器中,檢視show slave status\G,看到如下選項代表主從複製同步成功:
show slave status\G

最後注意:如果開發中寫的操作發生slave當中,主從同步馬上宣告失敗,因此開發中,我們必須清楚 master 和 slave 伺服器,slave 我們只是讓它負責 select,但是 slave 是可以 insert 資料的,但是清楚風險所在.