首頁 資料庫 mysql教程 資料庫 30 條軍規

資料庫 30 條軍規

Dec 24, 2019 pm 02:24 PM
資料庫

資料庫 30 條軍規

資料庫30 條軍規

一、基礎規格

(1)必須使用InnoDB 儲存引擎

解讀:支援交易、行級鎖定、並發效能更好、CPU 及記憶體快取頁最佳化使得資源利用率更高

(2)必須使用UTF8 字元集

解讀:萬國碼,無需轉碼,無亂碼風險,節省空間

(3)資料表、資料欄位必須加入中文註解

#解讀:N 年後誰tm 知道這個r1, r2, r3 字段是乾嘛的

#(4)禁止使用預存程序、視圖、觸發器、Event

解讀:高並發大資料的網路業務,架構設計想法是「解放資料庫CPU,將運算轉移到服務層」,並發量大的情況下,這些功能很可能將資料庫拖死,業務邏輯放到服務層有較好的擴充性,能夠輕易實現「增機器就加效能」。資料庫擅長儲存與索引,CPU 運算還是上移吧

(5)禁止儲存大檔案或大照片

解讀:為何要讓資料庫做它不擅長的事情?大檔案和照片儲存在檔案系統,資料庫裡存URI多好

二、命名規格

(6)只允許使用內網域名,而不是ip連接資料庫

(7)線上環境、開發環境、測試環境資料庫內網網域遵循命名規格

● 業務名稱:xxx

##● 線上環境:dj .xxx.db

● 開發環境:dj.xxx.rdb

● 測試環境:dj.xxx.tdb

● 從庫在名稱後面加上-s 標識,備庫在名稱後面加上-ss 標識

● 線上從庫:dj.xxx-s.db

● 線上備庫:dj.xxx-sss.db

(8)庫名、表名、字段名:小寫,下劃線風格,不超過32 個字符,必須見名知意,禁止拼音英文混用

(9)表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx

三、表設計規格

(10)單一實例表數必須小於500

#( 11)單表列數目必須小於30

(12)表必須有主鍵,例如自增主鍵

解讀:

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

* b)主鍵要選擇較短的資料類型, Innodb 引擎普通索引都會保存主鍵的值,較短的資料類型可以有效的減少索引的磁碟空間,提高索引的快取效率

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

(13)禁止使用外鍵,如果有外鍵完整性約束,需要應用程式控制

解讀:外鍵會導致表與表之間耦合,update 與delete 操作都會涉及相關聯的表,十分影響sql 的效能,甚至會造成死鎖。高並發情況下容易造成資料庫效能,大數據高並發業務場景資料庫使用以效能優先

四、字段設計規格

(14)必須把欄位定義為NOT NULL 並且提供預設值

解讀:

##* a)null 的欄位使索引/索引統計/值比較都更加複雜,對MySQL 來說更難優化

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

* c)null 值需要更多的儲存空,無論是表格或索引中每行中的null 的欄位都需要額外的空間來識別

* d)對null 的處理時候,只能採用`is null` 或`is not null`,而不能採用`=、in、<、<>、!=、not in` 這些操作符號。如:where name!='shenjian',如果存在name 為null 值的記錄,查詢結果就不會包含name 為null 值的記錄

(15)禁止使用TEXT、BLOB 類型

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

(16)禁止使用小數儲存貨幣

解讀:使用整數吧,小數容易導致金錢對不上

(17)必須使用varchar(20) 儲存手機號碼

解讀:

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

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

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

(18)禁止使用ENUM,可使用TINYINT 取代

解讀:

* a)增加新的ENUM 值要做DDL 運算

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

五、索引設計規格

(19)單一資料表索引建議控制在5 個以內

(20)單一索引欄位數不允許超過5 個

解讀:當欄位超過5 個時,實際上已經起不到有效過濾資料的作用了

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

解讀:

* a)更新會變更B 樹,更新頻繁的欄位建立索引會大幅降低資料庫效能

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

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

解讀:能夠更有效的過濾資料

六、SQL使用規範

(23)禁止使用SELECT *,只取得必要的字段,需要顯示說明列屬性

解讀:

* a)讀取不需要的列會增加CPU、IO、NET 消耗

* b)不能有效的利用覆蓋索引

* c)使用`SELECT *` 容易在增加或刪除欄位後出現程式BUG

#(24)禁止使用INSERT INTO t_xxx VALUES(xxx),必須顯示指定插入的列屬性

解讀:容易在增加或刪除欄位後出現程式BUG

(25)禁止使用屬性隱式轉換

解讀:`SELECT uid FROM t_user WHERE phone=13812345678` 會導致全表掃描,不能命中phone 索引,猜猜為什麼? (這個線上問題不只出現過一次)

(26)禁止在WHERE 條件的屬性上使用函數或表達式

解讀:`SELECT uid FROM t_user WHERE from_unixtime(day)> ;='2017-02-15'` 會導致全表掃描

正確的寫法是:`SELECT uid FROM t_user WHERE day>= unix_timestamp('2017-02-15 00:00:00') `

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

解讀:

* a)負向查詢條件:`NOT、!=、< ;>、!<、!>、NOT IN、NOT LIKE` 等,會導致全表掃描

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

#(28)禁止大表使用JOIN 查詢,禁止大表使用子查詢

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

(29)禁止使用OR 條件,必須改為IN 查詢

解讀:舊版Mysql 的OR 查詢是不能命中索引的,即使能命中索引,為何要讓資料庫耗費更多的CPU 幫助實施查詢優化呢?

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

總結:大數據量高並發的互聯網業務,極大影響資料庫效能的都不准用,不讓用喲。

推薦學習:MySQL教學

以上是資料庫 30 條軍規的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1655
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1226
24
iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

Hibernate 如何實作多型映射? Hibernate 如何實作多型映射? Apr 17, 2024 pm 12:09 PM

Hibernate多態映射可映射繼承類別到資料庫,提供以下映射類型:joined-subclass:為子類別建立單獨表,包含父類別所有欄位。 table-per-class:為子類別建立單獨資料表,僅包含子類別特有列。 union-subclass:類似joined-subclass,但父類別表聯合所有子類別列。

在PHP中使用MySQLi建立資料庫連線的詳盡教學 在PHP中使用MySQLi建立資料庫連線的詳盡教學 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

如何在PHP中處理資料庫連線錯誤 如何在PHP中處理資料庫連線錯誤 Jun 05, 2024 pm 02:16 PM

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

深入解析HTML如何讀取資料庫 深入解析HTML如何讀取資料庫 Apr 09, 2024 pm 12:36 PM

HTML無法直接讀取資料庫,但可以透過JavaScript和AJAX實作。其步驟包括建立資料庫連線、發送查詢、處理回應和更新頁面。本文提供了利用JavaScript、AJAX和PHP來從MySQL資料庫讀取資料的實戰範例,展示如何在HTML頁面中動態顯示查詢結果。此範例使用XMLHttpRequest建立資料庫連接,發送查詢並處理回應,從而將資料填入頁面元素中,實現了HTML讀取資料庫的功能。

如何在 Golang 中使用資料庫回呼函數? 如何在 Golang 中使用資料庫回呼函數? Jun 03, 2024 pm 02:20 PM

在Golang中使用資料庫回呼函數可以實現:在指定資料庫操作完成後執行自訂程式碼。透過單獨的函數新增自訂行為,無需編寫額外程式碼。回調函數可用於插入、更新、刪除和查詢操作。必須使用sql.Exec、sql.QueryRow或sql.Query函數才能使用回呼函數。

如何用 Golang 連接遠端資料庫? 如何用 Golang 連接遠端資料庫? Jun 01, 2024 pm 08:31 PM

透過Go標準庫database/sql包,可以連接到MySQL、PostgreSQL或SQLite等遠端資料庫:建立包含資料庫連接資訊的連接字串。使用sql.Open()函數開啟資料庫連線。執行SQL查詢和插入操作等資料庫操作。使用defer關閉資料庫連線以釋放資源。

如何使用C++處理資料庫連線和操作? 如何使用C++處理資料庫連線和操作? Jun 01, 2024 pm 07:24 PM

在C++中使用DataAccessObjects(DAO)函式庫連接和操作資料庫,包括建立資料庫連線、執行SQL查詢、插入新記錄和更新現有記錄。具體步驟為:1.包含必要的函式庫語句;2.開啟資料庫檔案;3.建立Recordset物件執行SQL查詢或操作資料;4.遍歷結果或依照特定需求更新記錄。

See all articles