1. 程式人生 > >mysql 優化60條建議

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 | 忽略| 使用索引| 關鍵。