數據庫varchar長度最佳實踐

http://dba.stackexchange.com/questions/76469/mysql-varchar-length-and-...mysql

主要以mysql的InnoDB或MyISAM爲例,其餘數據庫中基本也有varchar類型並須要提供長度的參數。
須要說明的是,例如VARCHAR(3)表示的是這一列最多存3個字符而不是3個字節,好比能夠存「一二三」,實際存儲時是編碼爲utf-8的。sql

在mysql中,VARCHAR(3)VARCHAR(255)在存儲方式上是沒有區別的,都是1個字節表示字符串長度和字符串經utf-8編碼後的字節。mysql5.0.3之前的版本varchar的最大長度就是255,以後是65535。而VARCHAR(256)以後表示長度的字節數會變成2個。其實在今天來講多一個字節也沒什麼區別,但爲了兼容性,一般的數據庫設計中仍是會出現不少VARCHAR(255)數據庫

但事實上,把全部較短的字符串列都設爲VARCHAR(255)並非最好的作法。儘管InnoDB是動態存儲的,但別的數據庫引擎不必定是如此。有的可能會使用固定長度的行,或者固定大小的內存表。內存表即爲sql查詢中產生的臨時表。它一般會爲varchar類型分配最大的空間,好比utf-8編碼下,內存表可能要爲VARCHAR(255)分配2+3×255字節(2是由於存的是字節長度而不是字符長度),若是行數很是多,這也會帶來性能問題。無論其中每一行存儲的數據是長仍是短。另外也注意到InnoDB的單列索引每一個結點的最大是767字節(即2+3×255)。數據庫設計

InnoDB最大的行的大小是半個database page(大約8000字節),若是可變長的列(如varbinary、varchar、text、blob)超過了這個大小會被存到外面去,行裏面只是存一個指針。這會比存inline慢不少。提到這個不得不說一下text類型,text的存儲方法應該和varchar也沒什麼區別,就是沒有長度的限制,所以它在有join等產生中間結果的查詢中會很是慢。性能

因此結論是,咱們應該用盡量小的類型而不是統一用VARCHAR(255)編碼

相關文章
相關標籤/搜索