Mysql 優化學習總結二 單錶優化

2021-07-16 05:39:57 字數 1446 閱讀 9653

1.單錶優化---欄位

盡量使用 tinyint,smallint,medium_int 代替int,如果非負數則加上unsigned

varchar的長度只分配真正需要的空間。

使用列舉或整數代替字串型別。

使用列舉或整數代替字串型別。

盡量使用timestamp而非datetime

單錶不要有太多字段,建議在20以內。

避免使用null欄位,很難查詢優化且占用額外索引空間

用整型來存ip

2.單錶優化--索引優化

索引並不是越多越好,要根據查詢有針對性的建立,考慮在whereorder by命令上涉及的列建立索引,可根據explain來檢視是否用了索引還是全表掃瞄

應盡量避免在where子句中對字段進行null值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄

值分布很稀少的字段不適合建索引,例如」性別」這種只有兩三個值的字段

字元欄位只建字首索引

字元字段最好不要做主鍵

不用外來鍵,由程式保證約束

盡量不用unique,由程式保證約束

使用多列索引時主意順序和查詢條件保持一致,同時刪除不必要的單列索引

3單錶優化--查詢

可通過開啟慢查詢日誌來找出較慢的sql

不做列運算:select id where age + 1 = 10,任何對列的操作都將導致表掃瞄,它包括資料庫教程函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊

sql語句盡可能簡單:一條sql只能在乙個cpu運算;大語句拆小語句,減少鎖時間;一條大sql可以堵死整個庫

不用select *or改寫成inor的效率是n級別,in的效率是log(n)級別,in的個數建議控制在200以內

不用函式和觸發器,在應用程式實現

避免%***式查詢

少用join使用同型別進行比較,比如用'123''123'比,123123

盡量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃瞄

對於連續數值,使用between不用inselect id from t where num between 1 and 5列表資料不要拿全表,要使用limit來分頁,每頁數量也不要太大

mysql優化學習

2.大表拆小表 1 一般不會設計屬性過多的表 2 一般不會超過500到1000萬資料的表 3 有大資料的列單獨拆為小表 3.根據需求展示更加合理的表結構 4.常用屬性分離為小表 2 方法 3 建立 2 分類 3 隔離級別 2 latch 輕量級鎖,鎖的時間非常短,用來操作臨界資源 3 一致性的非鎖定...

mysql優化學習筆記

定位執行效率低的sql語句 通過explain分析效率低的sql 通過show profile分析sql 通過trace分析優化器如何選擇執行計畫 確定問題,採取措施優化 匹配全值,條件所有列都在索引中而且是等值匹配 匹配值的範圍查詢,字段必須在索引中 匹配最左字首,復合索引只會根據最左列進行查詢 ...

鎖優化學習總結(一)

鎖優化主要分為兩個層面 層 jvm層。層 減少鎖持有時間 鎖粗化 減小鎖粒度 concurrenthashmap 鎖分離 readwritelock讀寫分離 jvm層 鎖消除 vector等安全容器,執行時不會出現資源競爭,將鎖消除 偏向鎖 輕量級鎖 自旋鎖 重量級鎖。偏向鎖 輕量級鎖並不是取代重量...