mysql建表效能優化 MYSQL建表優化

2021-10-17 13:19:42 字數 1360 閱讀 5958

除非單錶資料未來會一直不斷**,否則不要一開始就考慮拆分,拆分會帶來邏輯、部署、運維的各種複雜度,一般以整型值為主的表在千萬級以下,字串為主的表在五百萬以下是沒有太大問題的。

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...