(mysql優化-2) 結構優化

1.合適的數據類型mysql

a.使用能夠存下你的數據的最小的數據類型
b.使用簡單的數據類型,int要比varchar類型在mysql處理上簡單
c.儘量的使用not null定義字段
d.儘可能少用text類型,非用不可時最好考慮分表


2.結構優化sql

#用int來存儲日期時間

>create table test(id int primary key,timestr int);
>insert into test values(1,unix_timestamp('2018-03-20 14:00:00'));
>select id,from_unixtime(timestr) from test;
#用bigint來存儲ip地址

>create table sessions(id int primary key,ip bigint);
>insert into sessions values(1,inet_aton('192.168.0.1'));
>select id,inet_ntoa(ip) from sessions;


3.範式化與反範式化session

範式化(通常指第三範式)
商品id 商品 價格 重量 分類 分類描述
1 可樂 3.00 250ml 飲料 碳酸飲料
2 北冰洋 3.00 250ml 飲料 碳酸飲料
存在傳遞依賴
(商品id)-->(分類)-->(分類描述)
商品id 商品 價格 重量
1 可樂 3.00 250ml
2 北冰洋 3.00 250ml
分類 分類描述
飲料 碳酸飲料
商品id 分類
1 飲料
2 飲料
反範式化(對錶增長冗餘字段,以空間來換取時間)
用戶id 姓名 地址 電話
1 張三 東湖區 123456
2 李四 西湖區 789012
訂單id 用戶id 下單時間
1 2 2018-03-12 13:30:44
2 2 2018-03-12 13:40:01
當查詢訂單信息時(利用了鏈接查詢):
select A.用戶id,A.姓名,A.地址,A.電話,B.訂單id,B.下單時間 from A inner join B on A.用戶id = B.用戶id;
用戶id 姓名 地址 電話
1 張三 東湖區 123456
2 李四 西湖區 789012
訂單id 用戶id 下單時間 姓名 地址 電話
1 2 2018-03-12 13:30:44 李四 西湖區 789012
2 2 2018-03-12 13:40:01 李四 西湖區 789012
反範式化後:
select 用戶id,姓名,地址,電話,訂單id,下單時間 from B;


4.表的拆分優化

垂直拆分:就是把原來一個有不少列的表拆分紅多個表,這解決了表的寬度問題。一般的拆分能夠按如下原則進行
a.把不經常使用的字段單獨存放到一個表中
b.把大字段獨立存放的一個表中
c.把常常一塊兒使用的字段放在一塊兒
水平拆分:爲了解決單表的數據量過大問題,水平拆分的表每個表的結構都徹底一致的,經常使用的拆分方式
a.對id進行hash運算,若是要拆分紅5個表則使用mod(id,5)取出0-4個值
b.針對不一樣的hash把數據存到不一樣的表中
相關文章
相關標籤/搜索