原创 MySQL數據表優化設計(七):範式和反範式數據庫設計說的是啥?

在數據庫設計規範中,範式和反範式經常被提到。瞭解範式的概念和原則對我們設計數據表很有幫助,然而,範式並不是完美的,在實際開發中,經常是依據範式設計,再根據實際業務情況加入反範式設計,形成混合模式。也就是實際上很少會有完全的範式設計或完全的

原创 MySQL 數據表優化設計(八):如何設計統計數據表?

有些時候,改進數據表查詢性能的最佳方式是在同一張數據表中冗餘一些繼承的數據。然而,有些時候需要新建完全獨立的統計或緩存數據表,尤其是在需要反覆查詢的需求情況下。如果業務允許一些時間上的誤差的話,那麼這種方式會更好。 緩存型數據表通常在統

原创 MySQL 數據表優化設計(二):數值字段類型如何選擇?

在MySQL 中有兩種數值類型,整型和實數(即帶有小數的數字)。整型可以通過 TINYINT、SMALLINT、MEDIUMINT、INT 或 BIGINT 表示,分別對應8bit、16bit、24bit、32bit 和64bit 的存儲

原创 MySQL 數據表優化設計(三):CHAR 和 VARCHAR 怎麼選?

MySQL 支持字符串的數據類型並不多,但是卻有多種變化形式。MySQL 5.0以後更是支持每一列字符串可以有自己的字符集以及排序規則,這使得數據表設計更爲複雜。本篇介紹字符類型的數據表字段 CHAR 和 VARCHAR 該如何選擇。

原创 MySQL數據表優化設計(四):利用枚舉節省存儲空間

枚舉在實際數據表使用中不太多,但是在某些場合卻是可以發揮更好的性能,例如使用枚舉替換有限的字符串值。需要注意的是枚舉的存儲結構有點特殊,本篇介紹枚舉的應用場合及優勢。 枚舉在 MySQL 中的存儲方式十分精簡,依據枚舉值的多少使用1-2

原创 MySQL 數據表優化設計(五):id 該如何選擇數據類型?

爲 id 列選擇一個好的數據類型非常重要,id 列會經常用於做比較(例如聯合查詢的條件),以及用於查找其他列。而且,id 也經常用於外鍵。因此,id 列的數據類型不僅僅關係自身數據表,也關係到與之關聯的其他數據表。因此,id 用何種數據類

原创 MySQL 數據表優化設計(六):常見的數據表設計誤區整理

雖然會有一些常規意義上的數據表錯誤設計和優秀設計原則,但是同樣也會有 MySQL 特定的一些情況,這會導致我們犯一些 MySQL 特定的錯誤。本篇討論常見的設計誤區。 誤區一:過多的數據列 MySQL 存儲引擎的 API 是按照行緩衝區

原创 MySQL 數據表優化設計(一):數據類型選擇

MySQL支持大量的數據類型,選擇正確的類型對性能十分關鍵。本篇介紹了MySQL 的數據類型選擇原則,可以根據這些基本的原則確定數據表字段的具體數據類型。 小而美 通常來說,儘可能使用佔用存儲空間小的數據類型來存儲數據。這類數據類型通常

原创 MySQL 高級特性(八):使用事件(Events)自動完成計劃任務

事件(Events) 是在 MySQL 5.1後引入的,有點類似操作系統的計劃任務(cron),但是週期性任務是內置在 MySQL 服務端執行的。可以指定單次或以一定的間隔執行 SQL 代碼。通常是將複雜的 SQL 語句使用存儲過程封裝好

原创 MySQL 高級特性(9):全文索引使用指南

在 MySQL 中,我們經常使用 WHERE 條件用於進行值的相等比較、範圍過濾。然而,我們也會使用關鍵字進行搜索,這個基於搜索值與其他值的相關性來進行過濾。MySQL全文檢索即用於這種場景。本篇將介紹如何使用全文檢索。 全文索引需要特

原创 MySQL 高級特性(五):爲什麼不推薦你使用外鍵?

在早期的數據庫表結構設計中,往往會把一張表引用另外一張表的字段(通常是 id)作爲外鍵,藉助 MySQL 自動維護外鍵,確實能夠省掉很多開發工作,但是外鍵實際的代價不低,很多數據表設計規範已經明確禁止使用外鍵。本篇將介紹外鍵存在的缺陷。

原创 MySQL 高級特性(七):觸發器的正確打開方式

觸發器用於在 MySQL 執行插入、更新或刪除語句時,自動觸發執行其他SQL代碼。可以在執行語句前或執行後觸發其他 SQL 代碼運行。觸發器可以讀取觸發語句改變了哪些數據,但是沒有返回值。因此可以使用觸發器加強業務邏輯的約束而不需要在應用

原创 MySQL 高級特性(六):存儲過程的優缺點分析

MySQL 5.0 版本開始支持存儲過程。存儲過程(Stored Procedure)是數據庫中存儲的複雜程序,以便外部應用調用的一種數據庫對象。存儲過程是爲了完成特定功能的SQL語句集,經編譯創建並保存在數據庫中,用戶可通過指定存儲過程

原创 MySQL 高級特性(四):視圖(View)原理解析

MySQL 5.0以後引入了視圖。視圖實際是一個自身不存儲數據的虛擬數據表。實際這個虛擬表的數據來自於訪問視圖的 SQL 查詢的結果。MySQL 處理視圖和處理數據表差不多,通過這種方式來滿足很多需求。視圖和數據表在 MySQL 中共享命名

原创 MySQL 高級特性(二):數據表分區策略及優缺點分析

假設需要對一個包含了數年曆史數據、有價值的、基於時間序列的超級大的訂單數據表進行範圍查詢。我們需要對近一個月的數據進行統計查詢,這會涉及到一億行數據。也許新的版本的 MySQL 能夠支持,但是未來的數據量會更誇張,比如假設一個硬件應用產生