1.單錶優化---欄位
盡量使用 tinyint,smallint,medium_int 代替int,如果非負數則加上unsigned
。
varchar
的長度只分配真正需要的空間。
使用列舉或整數代替字串型別。
使用列舉或整數代替字串型別。
盡量使用timestamp
而非datetime
。
單錶不要有太多字段,建議在20以內。
避免使用null欄位,很難查詢優化且占用額外索引空間
用整型來存ip
2.單錶優化--索引優化
索引並不是越多越好,要根據查詢有針對性的建立,考慮在where
和order by
命令上涉及的列建立索引,可根據explain
來檢視是否用了索引還是全表掃瞄
應盡量避免在where
子句中對字段進行null
值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄
值分布很稀少的字段不適合建索引,例如」性別」這種只有兩三個值的字段
字元欄位只建字首索引
字元字段最好不要做主鍵
不用外來鍵,由程式保證約束
盡量不用unique
,由程式保證約束
使用多列索引時主意順序和查詢條件保持一致,同時刪除不必要的單列索引
3單錶優化--查詢
可通過開啟慢查詢日誌來找出較慢的sql
不做列運算:select id where age + 1 = 10
,任何對列的操作都將導致表掃瞄,它包括資料庫教程函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊
sql語句盡可能簡單:一條sql只能在乙個cpu運算;大語句拆小語句,減少鎖時間;一條大sql可以堵死整個庫
不用select *
or
改寫成in
:or
的效率是n級別,in
的效率是log(n)級別,in的個數建議控制在200以內
不用函式和觸發器,在應用程式實現
避免%***
式查詢
少用join
使用同型別進行比較,比如用'123'
和'123'
比,123
和123
比
盡量避免在where
子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃瞄
對於連續數值,使用between
不用in
:select 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等安全容器,執行時不會出現資源競爭,將鎖消除 偏向鎖 輕量級鎖 自旋鎖 重量級鎖。偏向鎖 輕量級鎖並不是取代重量...