熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

高性能MySQL:字符串類型(1)

2022-06-13   來源: MySQL 

   字符串類型(

  MySQL 支持多種字符串類型每種類型還有很多變種這些數據類型在 版本發生了很大的變化使得情況更加復雜從MySQL 開始每個字符串列可以定義自己的字符集和排序規則或者說校對規則(collation)(更多關於這個主題的信息請參考第 章)這些東西會很大程度上影響性能

  VARCHAR 和CHAR 類型

  VARCHAR 和CHAR 是兩種最主要的字符串類型不幸的是很難精確地解釋這些值是怎麼存儲在磁盤和內存中的因為這跟存儲引擎的具體實現有關下面的描述假設使用的存儲引擎是InnoDB 和/ 或者MyISAM如果使用的不是這兩種存儲引擎請參考所使用的存儲引擎的文檔

  先看看VARCHAR 和CHAR 值通常在磁盤上怎麼存儲請注意存儲引擎存儲CHAR 或者VARCHAR 值的方式在內存中和在磁盤上可能不一樣所以MySQL 服務器從存儲引擎讀出的值可能需要轉換為另一種存儲格式下面是關於兩種類型的一些比較

  VARCHAR

  VARCHAR 類型用於存儲可變長字符串是最常見的字符串數據類型它比定長類型更節省空間因為它僅使用必要的空間(例如越短的字符串使用越少的空間)有一種情況例外如果MySQL 表使用ROW_FORMAT=FIXED 創建的話每一行都會使用定長存儲這會很浪費空間

  VARCHAR 需要使用 個額外字節記錄字符串的長度如果列的最大長度小於或等於 字節則只使用 個字節表示否則使用 個字節假設采用latin 字符集一個VARCHAR() 的列需要 個字節的存儲空間VARCHAR() 的列則需要個字節因為需要 個字節存儲長度信息

  VARCHAR 節省了存儲空間所以對性能也有幫助但是由於行是變長的在UPDATE 時可能使行變得比原來更長這就導致需要做額外的工作如果一個行占用的空間增長並且在頁內沒有更多的空間可以存儲在這種情況下不同的存儲引擎的處理方式是不一樣的例如MyISAM 會將行拆成不同的片段存儲InnoDB則需要分裂頁來使行可以放進頁內其他一些存儲引擎也許從不在原數據位置更新數據

  下面這些情況下使用VARCHAR 是合適的字符串列的最大長度比平均長度大很多列的更新很少所以碎片不是問題使用了像UTF 這樣復雜的字符集每個字符都使用不同的字節數進行存儲

  在 或者更高版本MySQL 在存儲和檢索時會保留末尾空格但在 或更老的版本MySQL 會剔除末尾空格

  InnoDB 則更靈活它可以把過長的VARCHAR 存儲為BLOB我們稍後討論這個問題

  CHAR

  CHAR 類型是定長的MySQL 總是根據定義的字符串長度分配足夠的空間當存儲CHAR 值時MySQL 會刪除所有的末尾空格(在MySQL 和更老版本中VARCHAR也是這樣實現的也就是說這些版本中CHAR 和VARCHAR 在邏輯上是一樣的區別只是在存儲格式上)CHAR 值會根據需要采用空格進行填充以方便比較

  CHAR 適合存儲很短的字符串或者所有值都接近同一個長度例如CHAR 非常適合存儲密碼的MD因為這是一個定長的值對於經常變更的數據CHAR 也比VARCHAR 更好因為定長的CHAR 類型不容易產生碎片對於非常短的列CHAR 比VARCHAR 在存儲空間上也更有效率例如用CHAR() 來存儲只有Y 和N 的值如果采用單字節字符集注 只需要一個字節但是VARCHAR() 卻需要兩個字節因為還有一個記錄長度的額外字節

  CHAR 類型的這些行為可能有一點難以理解下面通過一個具體的例子來說明首先我們創建一張只有一個CHAR() 字段的表並且往裡面插入一些值

  當檢索這些值的時候會發現string 末尾的空格被截斷了

  如果用VARCHAR() 字段存儲相同的值可以得到如下結果

  數據如何存儲取決於存儲引擎並非所有的存儲引擎都會按照相同的方式處理定長和變長的字符串Memory 引擎只支持定長的行即使有變長字段也會根據最大長度分配最大空間不過填充和截取空格的行為在不同存儲引擎都是一樣的因為這是在MySQL 服務器層進行處理的

       返回目錄高性能MySQL

       編輯推薦

       ASPNET MVC 框架揭秘

       Oracle索引技術

       ASP NET開發培訓視頻教程

  數據倉庫與數據挖掘培訓視頻教程


From:http://tw.wingwit.com/Article/program/MySQL/201311/29687.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.