1. 程式人生 > >《高效能MySQL》筆記-列舉(ENUM)型別

《高效能MySQL》筆記-列舉(ENUM)型別

有時候可以使用列舉列代替常用的字串型別。列舉列可以把一些不重複的字串儲存成一個預定義的集合。MySQL在儲存列舉時非常緊湊,會根據列表值的數量壓縮到一個或者兩個位元組中。MySQL在內部會將每個值在列表中的位置儲存為整數,並且在表的.frm檔案中儲存“數字-字串”對映關係的“查詢表”。下面有一個例子:
這裡寫圖片描述
這三行資料實際儲存為整數,而不是字串。可以通過在數字上下文環境檢索看到這個雙重屬性:
這裡寫圖片描述
如果使用數字作為ENUM列舉常量,這種雙重性很容易導致混亂,例如ENUM(‘1’,’2’,’3’)。建議儘量避免這麼做。
另外一個讓人吃驚的地方是,列舉欄位是按照內部儲存的整數而不是定義的字串進行排序的:
這裡寫圖片描述


一種繞過這種限制的方式是按照需要的順序來定義列舉列。另外也可以在查詢中使用FIELD()函式顯示地指定排序順序,但這會導致MySQL無法利用索引消除排序。
這裡寫圖片描述
如果在定義時就是按照字母的順序,就沒有必要這麼做了。
列舉最不好的地方是,字串列表是固定的,新增或刪除字串必須使用ALTER TABLE。因此,對於一些列未來可能會改變的字串,使用列舉不是一個好主意,除非能接受只在列表末尾新增元素,這樣在MySQL5.1中就可以不用重建整個表來完成修改。
由於MySQL把每個列舉值儲存為整數,並且必須進行查詢才能轉換為字串,所以列舉列有一些開銷。通常列舉的列表都比較小,所以開銷還可以控制,但也不能保證一直如此。在特定情況下,把CHAR/VARCHAR列與列舉列進行關聯可能會比直接關聯CHAR/VARCHAR列更慢。
為了說明這個情況,我們對一個應用中的一張表進行基準測試,看看在MySQL中執行上面說的關聯的速度如何。該表有一個很大的主鍵:
這裡寫圖片描述

這個表有11萬行資料,只有10MB大小,所以可以完全載入記憶體。service列包含了5個不同的值,平均長度為4個字元,method列包含了71個值,平均長度為20個字元。我們複製一下這個表,但是把service和method欄位換成列舉型別,表結構如下:
這裡寫圖片描述
然後我們用主鍵列關聯這兩個表,下面是所使用的查詢語句:
這裡寫圖片描述
我們用VARCHAR和ENUM分別測試了這個語句,結果入標4-1所示。
這裡寫圖片描述
從上年的結果可以看到,當把列都轉換成ENUM以後,關聯變得很快。但是當VARCHAR列和ENUM列進行關聯時則慢很多。在本例中,如果不是必須和VARCHAR列進行關聯,那麼轉換這些列為ENUM就是個好主意。這是一個通用的設計實踐,在“查詢表”時採用整數主鍵而避免採用基於字串的值進行關聯。
然而,轉換列為列舉型還有另一個好處。根據SHOW TABLE STATUS命令輸出結果中Data_length列的值,把這兩列轉換為ENUM可以讓表的大小縮小1/3。在某些情況下,即使可能出現ENUM和VARCHAR進行關聯的情況,這也是值得的。同樣,轉換後主鍵也只有原來的一半大小了。因為這是InnoDB表,如果表上有其他索引,減小主鍵大小會使非主鍵索引也變得更小。

相關推薦

高效能MySQL筆記-列舉ENUM型別

有時候可以使用列舉列代替常用的字串型別。列舉列可以把一些不重複的字串儲存成一個預定義的集合。MySQL在儲存列舉時非常緊湊,會根據列表值的數量壓縮到一個或者兩個位元組中。MySQL在內部會將每個值在列表中的位置儲存為整數,並且在表的.frm檔案中儲存“數字-字串

C++11:強型別列舉enum

// C++11之前的enum型別是繼承C的,不溫不火; // C++11對enum動刀了,加強了型別檢查,推出強型別enum型別,眼前一亮 // 使用過QT 的都知道,早就應該這麼做了,用的很爽!! // 一、C中enum型別的侷限 // 1、非強型別作用域 enum

C#列舉enum

列舉(enum)是什麼? 1.列舉型別宣告為一組相關的符號常數定義了一個型別名稱。列舉用於“多項選擇”場合,就是程式執行時從編譯時已經設定的固定數目的“選擇”中做出決定。 列舉型別(也稱為列舉)為定義一組可以賦給變數的命名整數常量提供了一種有效的方法。例如,假設您必須定義一個變數,該變數的值表示

Java列舉Enum的簡單使用

Java列舉(Enum)的簡單使用 public enum Test { SUCCESS("000000", "success"), FAILURE("100000", "failure"), ILLEARG("100001", "illegal argume

【C++】列舉enum

目錄 宣告和定義 常規使用方法 自定義列舉量的值 列舉的取值範圍(一般不用考慮) 列舉應用 改進後的列舉 原有列舉的問題 改進--強型別列舉 專案中的強型別列舉程式碼片段 參考 宣告和定義 enum enumType {Monday, Tuesda

Java 列舉enum之淺進淺出

Java在1.5新增了列舉型別,說白了它就是一種特殊的Class;只是它不可以任意的去new例項物件,它的例項物件在定義enum時,就需要定義好了,這樣也就限制了這個類的範圍;比較常用的就是用來替代 public static final宣告的靜態常量。 一

內部類 列舉enum基本屬性和使用詳解

☆☆☆內部類和列舉的使用解析 列舉創建於呼叫 一、內部類 概念: 一個類中又定義了一個完整的類結構。 被包含的類 稱為 內部類 類體中包含其他類的類 稱為 外部類 其他的類 稱為 外部其他類 1、分類 (一)成員內部類 特點:

高效能mysql知識總結

1.讀寫鎖:        在處理併發讀或者寫時,可以通過實現一個由兩種型別的鎖組成的鎖系統來解決問題,如一個人正在讀取一個郵件表記錄,另外一個使用者試圖刪除編號為25的郵件,此時會出現資料讀取問題。       &nbs

【C#基礎】列舉Enum、結構體Struct、委託Delegate

1.列舉(Enum) 確定數量,確定取值。方向(東南西北),性別(男女) 語法:[public] enum 列舉名 {     值1,     值2,     值3,     

列舉enum所佔空間

列舉(enum) 列舉的定義: enum LOG_LEVEL { DBG, INF, WAR, ERR, FAT, ALL, OFF }; void WriteInfor(LOG_LEVEL level)

Java JDBC簡單入門之列舉Enum、泛型、反射、JDBC整合

簡介 JDBC(Java DataBase Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用J

MySQL 筆記整理2 --日誌系統,一條SQL查詢語句如何執行

發生 重要 表示 優勢 兩層 一秒 正在 引擎 http 筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 2) --日誌系統,一條SQL查詢語句如何執行   MySQL可以恢復到半個月內任意一秒的狀態,它的實現和日誌系統有關。上一篇中記錄了一條查詢語句是如何執行

MySQL 筆記整理2 --事務隔離,為什麽你改了我還看不見?

ble 優勢 控制 nod 讀寫 為什麽 數據操作 src 保持 筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 3) --事務隔離,為什麽你改了我還看不見?   簡單來說,事務就是要保證一組數據操作,要麽全部成功,要麽全部失敗。在MySQL中,事務支持是在引擎

高效能mysql筆記索引原理和型別

索引是查詢效能優化的最有效手段。(通俗點可以理解為圖書的目錄) b+tree索引 B-Tree有許多變種,其中最常見的是B+Tree,例如MySQL就普遍使用B+Tree實現其索引結構。 與B-Tree相比,B+Tree有以下不同點: 每個節點的指標上

PostgreSQL中的列舉型別Enum

    在PostgreSQL中,需要先使用create type 建立列舉型別。 1.建立列舉型別 create type week as enum('Sun','Mon','Tues','Wed','Thur','Fri','Sat'); 2.建立表 create

【五】高效能MySql筆記——快速ALTER TABLEHack手法

    MySql中大資料表的ALTER TABLE操作是非常耗時的。今天討論下如何快速完成表結構的修改?    ALTER TABLE的原理是用新結構建立一張新表,然後將舊錶的資料拷貝進新表,最後再刪除舊錶。ALTER TABLE會導致資料操作服務中斷。常用的方式是主備切換

java的列舉型別enum例項

列舉型別   實際上是我們在jdk1.5之前定義的 public static final XXX的常量 注意: 1)如果打算自定義自己的方法,那麼必須在enum例項序列的最後新增一個分號,而且Java要求必須先定義enum例項 2)所有的列舉都繼承自java.lang

MySQL進階資料型別優化

優化的資料型別 (一)更小的通常更好 更小的資料型別通常更快,因為它們佔用更少的磁碟、記憶體和CPU快取 (二)簡單就好 簡單資料型別通常需要更少的CPU週期。例如,整型比字元操作代價更低,因為字符集和校對規則使字元比整型更復雜 (三)儘量避免使用NULL 如果查詢中包含可為NULL

mysql 資料型別 高效能mysql筆記

1.選擇優化的資料型別 更小的通常更好。 ​ 應該儘量使用可以正確儲存資料的最小型別,更小的資料型別通常更快,因為他們佔用更少的磁碟,記憶體和CPU快取,並且處理時需要的CPU週期更少。 簡單就好 ​ 更簡單的資料型別的操作通常需要更少的CPU週期。例如,整型數字比字元操作代價更低,

mysqlmysql索引探索-- 高效能使用索引的策略

既然我們已經對索引的本質有所瞭解,那麼我們就應該來討論如何高效能的使用引擎。 1. 列的離散性越高,選擇性越好。 列的離散性是這樣定義的:count(discount col):count(col),也就是不同的列數比列的總數。這個數值越大說明列的離散型就越好。 如果用