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

MySQL支持大量的數據類型,選擇正確的類型對性能十分關鍵。本篇介紹了MySQL 的數據類型選擇原則,可以根據這些基本的原則確定數據表字段的具體數據類型。

小而美

通常來說,儘可能使用佔用存儲空間小的數據類型來存儲數據。這類數據類型通常也會更快,並且佔用的磁盤空間、內存乃至緩存都更小,而且佔用的 CPU 處理週期也少。

但是,務必準確估計要存儲的數據值的範圍。因爲在數據表結構的多個地方擴充數據範圍會是一個痛苦且耗時的過程。如果在猶豫哪種數據類型合適,那就選擇你認爲不會超出範圍的最小空間的類型(在系統早期或者數據表 數據不多的情況下也可以進行調整)。

簡單至上

數據類型越簡單意味着處理數據的 CPU 週期越少。例如,整型相比字符型而言,處理起來更容易,這是因爲字符集和比對使得字符的比較更復雜。舉兩個例子:應該使用 MySQL 內置的類型來存儲時間和日期,而不是字符串。IP 地址也應該使用整型存儲。

避免空值

很多數據表都是要可爲空的列,雖然在應用中並不需要存儲缺省值NULL。通常來說,指定列爲 NOT NULL 會比存儲 NULL 要更優。

MySQL 對於涉及到可爲空的列優化起來更爲困難,這是因爲空值列使得索引、索引統計和值比較都變得複雜。而且,可爲空的列佔據的存儲空間更大,且需要特殊的處理。如果在可爲空的列上指定了索引,這會需要每個索引入口多一個額外的字節,甚至會導致 MyISAM 引擎固定大小的索引轉換爲可變大小的索引(例如對整數型字段做單列索引)。
不過,將 NULL 列轉換爲 NOT NULL列的性能改進通常並不大。因此,除非已經發現了 NULL 列對性能有很大的影響,否則不要優先去對已有的數據表結構進行改動。但是,如果需要對列構建索引,那應該儘量避免該列值可以爲空,通常好的習慣是直接設置該列爲 NOT NULL。

當然,也有例外,例如在 InnoDB 中僅僅使用了一個 bit 來存儲 NULL 值,因此對大量數據存儲來說可以有效節省空間,但是如果是 MyISAM 引擎就不是這樣了。

選擇數據類型的步驟

選擇數據類型的第一步是決定數據列使用哪種常用的數據類型來表示,是數值型、字符串型還是時間類型。通常直接選擇就挺不錯的,但是在某些情況下會有特殊(比如金額、時間戳)。

第二步就是選擇具體的類型。MySQL對於同一種數據類型會有多種存儲方式,基於數據值範圍、精度以及存儲的物理空間,而還有些數據類型有一些特殊的屬性。

例如,DATETIME 和 TIMESTAMP 都可以存儲時間和日期,都可以精確到秒。然而,TIMESTAMP 類型只需要一半的存儲空間,並且包括了時區信息,還支持自動更新。但另一方面,它存儲的時間範圍更小,它的這些特殊特性可能變成障礙。

再來看看基本數據類型。MySQL 支持數據類型的別名,例如 INTEGER,BOOL 和 NUMERIC。這些僅僅是別名,雖然看起來會讓人困惑,但是實際上對性能沒有影響。如果使用了別名數據類型創建數據表,可回憶使用 SHOW CREATE TABLE,可以看到實際上 MySQL 會轉換爲基礎數據類型,而不是別名。

結語:MySQL 的數據表示方式很多,建議瞭解常用的數據類型的存儲範圍,佔據的字節數,儘可能地根據產品預估數據值範圍或長度,選擇合適的數據類型,從而在創建表一開始就注重性能。後期再來調整的代價往往超出設計之初付出的細緻思考的時間成本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章