**太多的列**
mysql的存儲引擎API工作時需要在服務器層和存儲引擎層之間通過行緩存格式拷貝數據,然后在服務層將緩存內容解碼成各個列.從行緩沖中將編碼過的列轉換成行數據結構的操作代價是非常高的
myisam的定長行結構實際上與服務層的行結構正好匹配,所以不需要轉換.然而myisam的變長行結構和Innodb的行結構則總是需要轉換.轉換的代價依賴于列的數量
**太多的關聯**
所謂的"實體-屬性-值"(ENV)設計模式是一個常見的糟糕設計模式,尤其在mysql下不能靠譜的工作.mysql限制了每個關聯操作最多只能有61張表,但是ENV數據庫需要很多自關聯.
事實上在許多關聯少于61張表的情況下,解析和優化查詢的代價也會成為mysql的問題
**全能的枚舉**
注意防止過度使用枚舉(ENUM)
~~~
create table ... (
country enum('','0','1','2',...'31')
~~~
這種模式的表設計非常凌亂.這么使用枚舉值類型也會在任何支持枚舉類型的數據庫都是一個有問題的設計方案,這里應該用整數作為外鍵關聯到字典表或者查找表來查找具體值
但是在mysql中,當需要在枚舉列表中增加一個新的國家時就要做一次ALTER TABLE操作,在mysql5.0以及更早的版本中ALTER TABLE是一個阻塞操作,即使在5.1和更新的版本中,如果不是在列表的末尾增加值也會一樣需要ALTER TABLE
**變相的枚舉**
枚舉(ENUM)列允許在列中存儲一組定義值中的單個值,集合(SET)列則允許在列中存儲一組定義值中的一個或多個值.有時候這可能比較容易導致混亂.這是一個例子
~~~
create table ... (
is_default set('Y', 'N') NOT NULL default 'N'
~~~
如果這里真和假兩種情況不會同時出現,那么毫無疑問應該使用枚舉列代替集合列
**非此發明的NULL**
寫了避免使用NULL的好處,并且建議盡可能考慮替代方案
即使需要存儲一個事實上的"空值"到表中,也不一定非得使用NULL.也許可以使用0,某個特殊值,或者空字符串作為代替
但是遵循這個原則也不要走極端.當確實需要表示未知值時也不要害怕使用null,在一些場景中,使用null可能會比某個神奇常數更好.從特定類型的值域中選擇一個不可能的值.例如使用-1代表一個未知的整數,可能導致代碼復雜很多,并容易引入bug,還可能會讓事情變得一團糟.處理null確實不容易,但有時候會比他的替代方案更好
下面是我們經常看到的例子
~~~
create table .. (
dt datetime not null default '0000-00-00 00:00:00'
~~~
偽造的全0值可能導致很多問題(可以配置mysql的sql_mode來禁止不可能的日期,對于新應用這是個非常好的實踐經驗,它不會讓創建的數據庫里充滿不可能的值).值得一提的是,mysql會在索引中存儲NULL值,而Oracle則不會
- 書列表
- laravel框架關鍵技術
- 第一章 組件化開發與composer使用
- 簡介
- composer
- 添加路由組件
- 添加控制器模塊
- 添加模型組件
- 添加視圖組件
- 第三章 laravel框架中常用的php語法
- 匿名函數
- 文件包含
- 魔術方法
- 魔術常量
- 反射
- 后期靜態綁定
- traits
- 第四章 laravel框架中使用的HTTP協議基礎
- HTTP協議
- 數據庫
- 數據遷移
- 第六章 laravel框架中的設計模式
- IOC模式
- php核心技術與最佳實踐
- 第一章面向對象核心
- 反射
- 簡單ORM
- 異常和錯誤
- 接口
- 第二章,面向對象設計
- 設計原則
- 單一職責
- 接口隔離
- 開放封閉
- 替換原則
- 依賴倒置
- linux是怎么寫的呢?
- 第三章 正則表達
- 認識正則
- 第四章 php網絡技術應用
- HTTP協議詳解
- php和http相關函數
- 垃圾信息防御措施
- 現代操作系統
- 引論
- sql必知必會
- 限制結果
- 按位置排序
- where求職順序
- IN操作符
- like
- 函數
- group by
- 組合查詢
- 插入檢索出的數據
- 視圖
- 高性能mysql
- 第一章節 mysql架構與歷史
- mysql架構邏輯圖
- 連接與管理
- 優化與運行
- 讀寫鎖
- 鎖粒度
- 表鎖(table lock)
- 行級鎖(row lock)
- ACID
- 隔離級別
- 死鎖
- 隱式和顯式鎖定
- 多版本并發控制
- Innodb概覽
- 第四章節 Schema與數據類型優化
- 選擇優化的數據類型
- 日期和時間類型
- 標識列
- 特殊類型數據
- 表設計中的缺陷
- 范式
- 計數器表
- 第五章 創建高性能索引
- 索引基礎
- 索引類型
- 索引的優點
- 高性能索引策略
- 選擇合適的索引列順序
- 聚簇索引
- 順序的主鍵什么時候會造成更壞的后果
- 覆蓋索引
- 使用索引掃描來做排序
- 壓縮索引
- 冗余和重復索引
- 索引和鎖
- 支持多種過濾條件
- 什么是范圍條件
- 優化排序
- 維護索引和表
- 表損壞
- 減少索引和數據的碎片
- 第六章 查詢性能優化
- 掃描的行數和訪問類型
- 重構查詢方式
- 查詢執行的基礎
- 重構-改善既有代碼設計
- 第一章-重構
- 什么是重構
- 第一個案列
- 重構第一步
- 王垠博客
- 多態取代價格相關邏輯