mysql 優化60條建議
1,頻繁查詢需求的介面在業務層,新增快取例如使用redis快取
2,養成檢視sql執行計劃的習慣
3,按需開啟或者關閉
query_cache 4,合理的增大inndb_buffer_pool_size
5,按需設定主從資料庫,讀寫分離等等
6,使用高效能的SDD硬碟儲存資料
7,定期維護更新刪除資料比較多的表,優化(會鎖表)
8,sql儘量避免全表掃描
9,
確定單條返回需要的列10
,避免大偏移量的分頁查詢,避免不已就利用延遲關聯或者子查詢優化超多分頁場景
12,儘可能避免複雜的加和子查詢
13,在加入表的時候使用相當型別的列,並將其索引
14,加入查詢遵循小結果集驅動大的結果集的原則,BNLJ
15, in和exists的使用遵循,外層查詢表小於子查詢表,則用存在,外層查詢表大於子查詢表,則用於
16,注意隱式轉換
17,不要使用ORDER BY RAND()語句,儘量減少filesort
18,其中語句中不要有運算
19,在查詢建議不要超過1000,合理拆分插入,刪除語句
20,不要使用計數(列名)或計數(常量)來替代計數(*),計數(* )是SQL92定義的標準統計行數的語法,跟資料庫無關,跟NULL和非NULL無關。說明:count(*)會統計值為NULL的行,而count(列名)不會統計此列為NU LL值的行
21,TRUNCATE TABLE比較DELETE速度快,且使用的系統和事務日誌資源少,但TRUNCATE無事務且不觸發觸發器,有可能造成事故
22,業務層,分頁查詢邏輯時,若計為0應直接返回,不繼續進行分頁查詢
23,使用ISNULL()來判斷是否為NULL值.Not與任何值的直接比較都為
NULL。24,count語句不會出現null,但是sum會,注意NPE問題
25,count(distinct col)計算該列除了之外的不重複行數,注意計數(distinct col1,col2)如果其中一列全為NULL,那麼即使另一列有不同的值,也返回為0。
26,業務上具有唯一特性的欄位,即使是多個欄位的組合,也必須建成唯一索引。墨菲定律
27,超過三個表禁止join。需要join的欄位,資料型別必須絕對一致;多表關聯查詢時,保證被關聯的欄位需要有索引
.28,在varchar欄位上建立索引時,必須指定索引長度,不必要對全欄位建立索引,根據實際文字區分度決定索引長度即可.29
,頁面搜尋嚴禁左模糊或者全模糊(不走索引的),如果需要請走搜尋引擎來解決
30,如果有順序by的場景,請注意利用索引的有序性,依據業務排序要求等添加升序或者降序索引
31 ,利用覆蓋索引來進行查詢操作
32,建組合索引的時候,區分度最高的在最左邊,存在非等號和等號混合時,等號條件的列前置
33,合理新增組合索引(組合索引最多支援16列)
34,主鍵長度越小越好,最好永遠都未一張表新增一個主鍵ID並設定非 自增
35,刪除無用的索引基數接近為1的索引,msyql8.0使用隱藏索引
36,表達是與否概念的欄位,必須使用is_xxx的方式命名,資料型別是unsigned tinyint(1表示是,0表示否)
37,表名,欄位名必須使用小寫字母或數字,禁止出現數字開頭,禁止兩個下劃線中間只出現數字,MySQL在Windows下不區分大小寫,但在Linux下預設是區分大小寫
38,表名不使用複數名詞
39,禁用保留字,desc,範圍,匹配,延遲
40,主鍵索引名為pk_欄位名;唯一索引名為uk_欄位名;普通索引名則為idx_欄位名
41,小數型別為decimal,禁止使用float和
double.42,如果儲存的字串長度幾乎相等,使用char定長字串型別
.43,欄位允許適當冗餘,以提高查詢效能,但必須考慮資料一致。冗餘欄位應遵循:1)不是頻繁修改的欄位
1.建立表的儲存引擎必須是InnoDB,並指定主鍵,不允許外來鍵,同時不允許存在和主鍵重複的索引
2。非分割槽表不允許使用聯合主鍵。
3.自增長欄位必須是主鍵或唯一索引。
4.不允許在資料庫中儲存諸如圖片,影像之類的二進位制資料。
5.不允許使用TEXT型別欄位
6。建表時不允許顯式的指定除了utf8,utf8mb4之外的其他字符集,
如果有儲存評論,名字,描述等可能包含表情,特殊字元的字串,必須使用utf8mb4.7。
對於所有宣告為NOT
8.必須包含時間戳欄位DataChange_LastTime,定義預設值為
CURRENT_TIMESTAMP on update,並新增索引.9。DataChange_CreateTime
,作為行建立時間,定義預設值時請不要新增
CURRENT_TIMESTAMP on NULL的欄位,必須顯式指定預設值。更新,直接設定CURRENT_TIMESTAMP即可。
10.禁止使用子查詢。
11.禁止使用選擇*,必須指定需要的欄位。
12.更新/刪除只能單表操作,不允許多表關聯,不允許用子查詢,且一定要帶條件.13。
插入語句要顯式指定插入的列名,且不允許使用insert .... select的形式。
14.不允許使用儲存過程,儲存函式,觸發器和檢視.15。
單條查詢語句中,不允許出現多於一次的連線.16。
不要在哪裡後的篩選欄位上做運算
.17 。不允許在查詢語句中指定索引提示force | 忽略| 使用索引| 關鍵。