MySQL規範及優化
1、基本規則
1.1 、儘量不在資料庫做運算 運算儘可能移到程式端CPU。
1.2、 控制單表資料量
1.2.1、一年內的單表資料量預估 >純INT不超過1000W >含CHAR不超過500W
1.2.2、合理分表不超載 > 取模 例如:id%n=0 —> tabel0; id%n=1 —> tabel1; id%n=2 —> tabel2; … > 時間 例如可以根據月份、季度、年進行分表 > 雜湊 例如一個電商網站,需要記錄使用者的所有購買記錄,如果將所有的記錄放到 一張userBuy表中,勢必會非常巨大,所以我們可以通過對userid進行分表處 理,將不同的使用者購買記錄放到不同的分表中,比如對userid做crc32的hash 計算,然後用得到的雜湊值進行取餘,取餘的餘數就是你的分表數,餘數則 是該userid需要記錄進入的表。 > 區域 例如主鍵id範圍進行分表
> 引擎. 可以使用Mysql的MyISAM儲存引擎,因為其支援MERAGE型別,結合 UNION來實現資料表的分割和資料同步。這種方式的優點就是可以保留表 的外來鍵、事務以及其它屬性,但是缺點就是查詢效能比較低,同步也不夠 靈活,所以大多不推薦這種方式實現分表。
1.3、遵循三大正規化
> 第一正規化(1NF) 1NF是指資料庫中表的每一列都是不可分割的基本資料項,同一列的資料不 能有多個值。如果出現重複,就可能需要定義一個新的實體(即:生成一 個新的表)來描述關係。 例如:公司中某個人員隸屬於多個部門,那麼在人員中,這個人部門欄位 可以儲存多個值,但是這樣違反了1NF。 解決辦法:此時可以生成一個新表,表示人員與部門的關係。
> 第二正規化(2NF) 2NF是在1NF的基礎上建立的,所以滿足2NF的必須滿足1NF; 2NF要求資料庫中表的每個例項或行必須能唯一的區分。為實現區分通 常需要為表加上一個列(主鍵)或多列(聯合主鍵); 2NF要求實體的屬性完全依賴於主鍵。如果存在依賴主鍵一部分的屬性 那麼這個屬性和主鍵應該分離出來形成一個新的實體,新實體於原實體之間 是一對多的關係。簡而言之,就是2NF非主屬性不能部分依賴於主鍵。
> 第三正規化(3NF) 3NF依賴於2NF; 3NF要求一個數據庫表中不包含在其他表中已經存在的非主鍵的欄位; 3NF表屬性不能依賴其他表中非主鍵的屬性;
1.4、拒絕3B >大SQL(Big SQL) >大事務(Big Transaction) >大批量(Big Batch)
2、欄位規則
>將字串轉化為數字:查詢快、佔用空間小,比如無符號INT儲存IP。 >優先使用Enum或SET:可能值已知且有限的字串型別。 >避免使用NULL欄位:很難進行查詢優化、NULL列加索引,需要額外的 空間、含NULL複合索引無效。 >少用並拆分TEXT/BLOB Text型別處理效能遠低於VARCHAR(強制生成臨時表、浪費更多空間) >不在資料庫中存圖片
3、索引規則
>謹慎合理新增索引 改善查詢 減慢更新 能不加索引則不加索引 >大量重複值索引無效 例如:性別列 >不在索引列做數學或函式運算 無法使用索引 導致全表掃描 >儘量不用外來鍵 可到達其它表意味著“鎖” 高併發容易死鎖
4、SQL優化
4.1、OR · 同一欄位將OR改寫為IN · 不同欄位將OR改寫為UNION 舉例:Select * from opp where phone=‘010-88886666’ or cellPhone= ‘13800138000’; 優化: Select * from opp where phone=‘010-88886666’ union Select * from opp where cellPhone=‘13800138000’;
4.2、避免負向查詢和%字首查詢 >NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等 >%字首:使用不了索引、導致全表掃描。
國慶就要放假了,提前一天回家,啊啊啊啊啊啊啊,沒心情寫了,暫時就這些吧先,祝萬千猿友假期愉快!