char与varchar区别(MYISAM)
Char屬于固定長度的字符類型,而varchar屬于可變長的字符類型。
下表將各種字符串值保存到char(4)和varchar(4)列后的結果,說明了char和varchar之間的差別
| 值 | Char(4) | 存儲需求 | Varchar (4) | 存儲需求 |
| ‘’ | ‘?????’ | 4字符節 | ‘’ | 1字符節 |
| ‘ab’ | ‘ab???’ | 4字符節 | ‘ab ’ | 3字符節 |
| ‘abcd’ | ‘abcd’ | 4字符節 | ‘abcd’ | 5字符節 |
| ‘abcdefgh’ | ‘abcd’ | 4字符節 | ‘abcd’ | 5字符節 |
請注意,最后一行的值只適用于非“嚴格模式”時,如果mysql運行在嚴格模式,超過列長度的值將不會保存,并且會出現錯誤提示。
?????????從char(4)和varchar(4)列檢索的值并不總是相同,因為檢索事從char列刪除了尾部的空格。
?????????由于char是固定長度的,所以他的處理速度比varhcar快的多,但是其缺點是浪費存儲空間,程序需要對尾行空格進行處理,所以對于哪些長度變化不大并且對查詢速度要求較高的數據可以考慮使用char類型存儲
?????????另外,隨著mysql版本的不斷升級,varchar數據類型的性能也在不斷改進并提高,所以在許多應用中,varvhar類型被更多使用
?????????在mysql中,不同的存儲引擎對char和varchar的使用原則有所不同,這里簡單概括若下:
??Myisam存儲引擎:建議使用固定長度的數據列代替可變長的數據列
??Memory存儲引擎:目前都使用固定長度的數據行存儲,因此無論使用char varchar列都沒有關系,兩者都是作為char類型處理
??Innodb存儲引擎:建議使用varchar類型。對于innodb數據表,內部的行存儲格式沒有區分固定長度和可變長度列(所有數據行都使用指向數據列值的頭指針),因此在本質上,使用固定長度的char列不一定比使用可變長度varchar的性能要好,因此,主要的性能因素是數據行使用的存儲總量,由于char平均占用的空間多于varchar,因此使用varchar來最小化需要處理的數據行的存儲總量和磁盤I/O是比較好的。
上面來自網易《深入淺出MYSQL數據庫開發、優化與管理維護》
以下是測試過程,針對MYISAM,5.5.19 MySQL Community Server (GPL):
表結構
?
插入100萬條記錄
| DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `test1`$$ CREATE DEFINER=`admin`@`%` PROCEDURE `test1`() BEGIN ??? DECLARE i INT DEFAULT 1; ??? ??? WHILE i <= 1000000 DO ??? ??? INSERT INTO test1 VALUES (i,i,'abc'); ??? ??? SET i=i+1; ??? ??? END WHILE; ?? ??? END$$ DELIMITER ; |
?
| DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `test2`$$ CREATE DEFINER=`admin`@`%` PROCEDURE `test2`() BEGIN ??? DECLARE i INT DEFAULT 1; ??? ??? WHILE i <= 1000000 DO ??? ??? INSERT INTO test2 VALUES (i,i,'abc'); ??? ??? SET i=i+1; ??? ??? END WHILE; ?? ??? END$$ DELIMITER ; |
[root@vm01 test]# ll -h |grep test
-rw-rw---- 1 mysql mysql 8.5K 04-01 17:16 test1.frm
-rw-rw---- 1 mysql mysql? 19M 04-01 17:20 test1.MYD
-rw-rw---- 1 mysql mysql? 17M 04-01 17:20 test1.MYI
-rw-rw---- 1 mysql mysql 8.5K 04-01 17:16 test2.frm
-rw-rw---- 1 mysql mysql? 20M 04-01 17:26 test2.MYD
-rw-rw---- 1 mysql mysql? 12M 04-01 17:26 test2.MYI
char表數據+主鍵+索引=19M+17M=36M
varchar表數據+主鍵+索引=20M+12M=32M
=====================================================================
下面測試不帶索引的。
插入100萬條記錄
-rw-rw---- 1 mysql mysql 8.5K 04-01 17:44 test1.frm
-rw-rw---- 1 mysql mysql? 19M 04-01 18:01 test1.MYD
-rw-rw---- 1 mysql mysql 9.8M 04-01 18:01 test1.MYI
-rw-rw---- 1 mysql mysql 8.5K 04-01 17:44 test2.frm
-rw-rw---- 1 mysql mysql? 20M 04-01 18:04 test2.MYD
-rw-rw---- 1 mysql mysql 9.9M 04-01 18:04 test2.MYI
char表數據+主鍵=19M+9.8M=28.8M
varchar表數據+主鍵=20M+9.9M=29.9M
?
=====================================================================
下面測試不帶主鍵和索引的。
?
插入100萬條記錄
[root@vm01 test]# ll -h | grep test
-rw-rw---- 1 mysql mysql 8.5K 04-01 18:08 test1.frm
-rw-rw---- 1 mysql mysql? 19M 04-01 18:10 test1.MYD
-rw-rw---- 1 mysql mysql 1.0K 04-01 18:10 test1.MYI
-rw-rw---- 1 mysql mysql 8.5K 04-01 18:08 test2.frm
-rw-rw---- 1 mysql mysql? 20M 04-01 18:11 test2.MYD
-rw-rw---- 1 mysql mysql 1.0K 04-01 18:11 test2.MYI
char表數據=19M
varchar表數據=20M
=====================================================================
總結:針對MYISAM引擎,如果使用varchar字符類型,增加索引的容量要小于不加索引的。
?
轉載于:https://blog.51cto.com/liang3391/823326
總結
以上是生活随笔為你收集整理的char与varchar区别(MYISAM)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AgileEAS.NET SOA 中间件
- 下一篇: open×××+Mysql+PAM构建强