MySQL必須知道的點

2021-10-16 04:13:23 字數 2840 閱讀 9348

mysql已經成為世界上最受歡迎的資料庫管理系統之一,無論是用在小型開發專案上,還是用在構建那較大型的**,mysql都用實力證明了自己是乙個穩定、可靠、快速、可信的系統,足以勝任任何資料儲存業務的需要。

使用過程中,這些點你都知道嗎?

1.必須使用innodb儲存引擎

有更好的cpu和io效能,更好的備份和鎖表機制,提高統計和除錯效率。

另外,作為一 個系統,innodb支援多種關鍵功能,其中最重要的是事務日誌和行級鎖。事務日誌記錄真正的資料庫事務,但更重要的是資料崩潰恢復和回滾。

基於 inoodb方式的io,能給予更安全資料保護和更好效能表現。另外,在大多數的情況下,行級鎖可以提供更高的併發效能,因為使用者只鎖定他們正在寫的資料,而讀資料永遠不會被阻塞 。

2.資料表、資料字段必須加入中文注釋

方便日後新人小哥,更快理解熟悉;並且可讀性更好。同時在status這類字段上標註:0表示刪除,1表示正常 等列舉值。

3.必須使用utf8mb4字符集

utf8是通用的字符集,mb4 在utf8上進行了擴充套件,支援emoj等新的字元。

4.禁止使用儲存過程、檢視、觸發器、event、join等

高併發大資料的網際網路業務,架構設計思路是「解放資料庫cpu,將計算轉移到服務層」,資料庫擅長儲存與索引,cpu計算在業務層更合理。

5.禁止儲存大檔案或者大**

當人員**較多時,分頁查詢速度明顯變慢,之前1秒內響應,加了**欄位後,需要4~5秒左右才能響應。

大檔案和**儲存在檔案系統,資料庫裡存uri更好

6.表必須有主鍵,例如自增主鍵

a)主鍵遞增,資料行寫入可以提高插入效能,可以避免page**,減少表碎片提公升空間和記憶體的使用。

b)使用數字型別主鍵,較短的資料型別可以有效的減少索引的磁碟空間,提高索引的快取效率。

c)無主鍵的表刪除,在row模式的主從架構,會導致備庫夯住。

d)  更多使用業務主鍵,在分庫分表會有更多便利性。

7.禁止使用外來鍵,如果有外來鍵完整性約束,需要應用程式控制

外來鍵會導致表與表之間耦合,update與delete操作都會涉及相關聯的表,十分影響sql的效能,甚至會造成死鎖。

8.必須把字段定義為not null並且提供預設值

a)null的列使索引/索引統計/值比較都更加複雜,對mysql來說更難優化。

b)null 這種型別mysql內部需要進行特殊處理,增加資料庫處理記錄的複雜性;同等條件下,表中有較多空字段的時候,資料庫的處理效能會降低很多。

c)null值需要更多的儲存空,無論是表還是索引中每行中的null的列都需要額外的空間來標識。

d)對null 的處理時候,只能採用is null或is not null,而不能採用=、in、<、<>、!=、not in這些操作符號。

如:where name!=』nx』,如果存在name為null值的記錄,查詢結果就不會包含name為null值的記錄。

9.禁止使用text、blob型別

會浪費更多的磁碟和記憶體空間,非必要的大量的大字段查詢會淘汰掉熱資料,導致記憶體命中率急劇降低,影響資料庫效能。

10.禁止使用小數儲存貨幣

使用整數吧,小數容易導致錢對不上。

11.必須使用varchar(20)儲存手機號

a)涉及到區號或者國家代號,可能出現+-()

b)手機號會去做數**算麼?

c)varchar可以支援模糊查詢,例如:like「138%」

12.禁止使用enum,可使用tinyint代替

a)增加新的enum值要做ddl操作

b)enum的內部實際儲存就是整數,你以為自己定義的是字串?

13.關於索引設計

(1)單錶索引建議控制在5個以內

索引並不是越多越好!索引可以提高效率同樣可以降低效率。

索引可以增加查詢效率,但同樣也會降低插入和更新的效率,甚至有些情況下會降低查詢效率。

因為mysql優化器在選擇如何優化查詢時,會根據統一資訊,對每乙個可以用到的索引來進行評估,以生成出乙個最好的執行計畫,如果同時有很多個索引都可以用於查詢,就會增加mysql優化器生成執行計畫的時間,同樣會降低查詢效能。

(2)禁止在更新十分頻繁、區分度不高的屬性上建立索引

a)更新會變更b+樹,更新頻繁的字段建立索引會大大降低資料庫效能

b)「性別」這種區分度不大的屬性,建立索引是沒有什麼意義的,不能有效過濾資料,效能與全表掃瞄類似

(3)建立組合索引,必須把區分度高的字段放在前面

理由:能夠更加有效的過濾資料

14.關於sql使用規範

(1)禁止使用insert into t_*** values(***),必須顯示指定插入的列屬性

理由:容易在增加或者刪除欄位後出現程式bug

(2)禁止在where條件的屬性上使用函式或者表示式

理由:select uid from t_user where from_unixtime(day)>='2019-10-09' 會導致全表掃瞄

正確的寫法是:select uid from t_user where day>= unix_timestamp('2019-10-09 00:00:00')

(3)禁止負向查詢,以及%開頭的模糊查詢

理由:a)負向查詢條件:not、!=、<>、!<、!>、not in、not like等,會導致全表掃瞄

b)%開頭的模糊查詢,會導致全表掃瞄

(4)禁止大表使用join查詢,禁止大表使用子查詢

理由:會產生臨時表,消耗較多記憶體與cpu,極大影響資料庫效能

(5)禁止使用or條件,必須改為in查詢

理由:舊版本mysql的or查詢是不能命中索引的,即使能命中索引,為何要讓資料庫耗費更多的cpu幫助實施查詢優化呢?

(6)應用程式必須捕獲sql異常,並有相應處理

前端網路必須知道的點

allow control access origin 必需,表示可以請求的源。access control allow methods 必需,表示支援的所有方法,以逗號分隔 access control allow headers 如果瀏覽器請求包括 access control req方法,以逗...

必須知道的導致程式崩潰點。

1.在 開發過程中,有的時候我們會在源 中新增一些除錯 和資訊列印,因為想看看程式執行到這個點會發生些什麼。每次出現這種情況的時候,我建議你想想是否新增乙個單元測試用例會更有意義?除錯完就沒用的 通常沒有必要留著。但有的時候,我們仍會留下一些日誌列印,以便出現問題時可以更好地進行診斷。2.在c 中可...

必須知道的設計模式

設計模式 design pattern 物件導向 設計模式 引言 設計模式是物件導向思想的集大成,gof在其經典著作中總結了23種設計模式,又可分為 建立型 結構型和行為型3個大類。對於軟體設計者來說,一般的過程就是在熟練掌握語言背景的基礎上,了解類庫的大致框架和常用的函式和介面等,然後多再在百般錘...