除非單錶資料未來會一直不斷**,否則不要一開始就考慮拆分,拆分會帶來邏輯、部署、運維的各種複雜度,一般以整型值為主的表在千萬級以下,字串為主的表在五百萬以下是沒有太大問題的。
1:字段
a:盡量使用tinyint、smallint、medium_int作為整數型別而非int,如果非負則加上unsigned
b:varchar的長度只分配真正需要的空間
c:使用列舉或整數代替字串型別
d:盡量使用timestamp而非datetime,
e:單錶不要有太多字段,建議在20以內
f:避免使用null欄位,很難查詢優化且占用額外索引空間
g:用整型來存ip
2:索引
a:索引並不是越多越好,要根據查詢有針對性的建立,考慮在where和order by命令上涉及的列建立索引,可根據explain來檢視是否用了索引還是全表掃瞄
b:應盡量避免在where子句中對字段進行null值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄
c:值分布很稀少的字段不適合建索引,例如"性別"這種只有兩三個值的字段
d:字元欄位只建字首索引
e:字元字段最好不要做主鍵
f:不用外來鍵,由程式保證約束
g:盡量不用unique,由程式保證約束
h:使用多列索引時主意順序和查詢條件保持一致,同時刪除不必要的單列索引
3:查詢sql
a:可通過開啟慢查詢日誌來找出較慢的sql
b:不做列運算:select id where age + 1 = 10,任何對列的操作都將導致表掃瞄,它包括資料庫教程函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊
c:sql語句盡可能簡單:一條sql只能在乙個cpu運算;大語句拆小語句,減少鎖時間;一條大sql可以堵死整個庫
d:不用select *
e:or改寫成in:or的效率是n級別,in的效率是log(n)級別,in的個數建議控制在200以內
f:不用函式和觸發器,在應用程式實現
g:避免%***式查詢,查詢sql
h:少用join
i:使用同型別進行比較,比如用'123'和'123'比,123和123比
j:盡量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃瞄
k:對於連續數值,使用between不用in:select id from t where num between 1 and 5
l:列表資料不要拿全表,要使用limit來分頁,每頁數量也不要太大
4:讀寫分離
也是目前常用的優化,從庫讀主庫寫,一般不要採用雙主或多主引入很多複雜性,盡量採用文中的其他方案來提高效能。同時目前很多拆分的解決方案同時也兼顧考慮了讀寫分離
5:快取
6:**架構
mysql建表 索引以及SQL效能優化
1前言2 設計部分 2.1設計表注意事項 2.1.1 定義字段型別 盡可能精確地定義字段型別,包括型別和長度 如不要以字元型別宣告純數字字段,業務上tinyint夠用的情況避免定義為int等。2.1.2 盡可能使用not null null需要更多的 更多的檢查和特殊的索引邏輯。所以大多數時候應該使...
mysql建表原則 mysql優化1 建表原則
建表三大原則 定長和變長分離 常用字段和不常用字段分離 使用冗餘欄位或冗餘表 1 定長與變長分離 如 id int,佔4個位元組,char 4 佔4個字元長度,也是定長,time 即每乙個單元值佔的位元組是固定的。在磁碟上查詢時,由於每一行長度固定,比如長度為10000,查下一條時只需查 10001...
MySQL優化 從建表開始優化
1 不要使用使用null欄位,設定字段預設值 bad case namechar 32 default null ageint not null good case namechar 32 not null default ageint not null default 0 2 用好數值型別 tin...