char与varchar区别(MYISAM)
Char屬于固定長度的字符類型,而varchar屬于可變長的字符類型。
下表將各種字符串值保存到char(4)和varchar(4)列后的結(jié)果,說明了char和varchar之間的差別
| 值 | Char(4) | 存儲需求 | Varchar (4) | 存儲需求 |
| ‘’ | ‘?????’ | 4字符節(jié) | ‘’ | 1字符節(jié) |
| ‘a(chǎn)b’ | ‘a(chǎn)b???’ | 4字符節(jié) | ‘a(chǎn)b ’ | 3字符節(jié) |
| ‘a(chǎn)bcd’ | ‘a(chǎn)bcd’ | 4字符節(jié) | ‘a(chǎn)bcd’ | 5字符節(jié) |
| ‘a(chǎn)bcdefgh’ | ‘a(chǎn)bcd’ | 4字符節(jié) | ‘a(chǎn)bcd’ | 5字符節(jié) |
請注意,最后一行的值只適用于非“嚴(yán)格模式”時,如果mysql運(yùn)行在嚴(yán)格模式,超過列長度的值將不會保存,并且會出現(xiàn)錯誤提示。
?????????從char(4)和varchar(4)列檢索的值并不總是相同,因?yàn)闄z索事從char列刪除了尾部的空格。
?????????由于char是固定長度的,所以他的處理速度比varhcar快的多,但是其缺點(diǎn)是浪費(fèi)存儲空間,程序需要對尾行空格進(jìn)行處理,所以對于哪些長度變化不大并且對查詢速度要求較高的數(shù)據(jù)可以考慮使用char類型存儲
?????????另外,隨著mysql版本的不斷升級,varchar數(shù)據(jù)類型的性能也在不斷改進(jìn)并提高,所以在許多應(yīng)用中,varvhar類型被更多使用
?????????在mysql中,不同的存儲引擎對char和varchar的使用原則有所不同,這里簡單概括若下:
??Myisam存儲引擎:建議使用固定長度的數(shù)據(jù)列代替可變長的數(shù)據(jù)列
??Memory存儲引擎:目前都使用固定長度的數(shù)據(jù)行存儲,因此無論使用char varchar列都沒有關(guān)系,兩者都是作為char類型處理
??Innodb存儲引擎:建議使用varchar類型。對于innodb數(shù)據(jù)表,內(nèi)部的行存儲格式?jīng)]有區(qū)分固定長度和可變長度列(所有數(shù)據(jù)行都使用指向數(shù)據(jù)列值的頭指針),因此在本質(zhì)上,使用固定長度的char列不一定比使用可變長度varchar的性能要好,因此,主要的性能因素是數(shù)據(jù)行使用的存儲總量,由于char平均占用的空間多于varchar,因此使用varchar來最小化需要處理的數(shù)據(jù)行的存儲總量和磁盤I/O是比較好的。
上面來自網(wǎng)易《深入淺出MYSQL數(shù)據(jù)庫開發(fā)、優(yōu)化與管理維護(hù)》
以下是測試過程,針對MYISAM,5.5.19 MySQL Community Server (GPL):
表結(jié)構(gòu)
?
插入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表數(shù)據(jù)+主鍵+索引=19M+17M=36M
varchar表數(shù)據(jù)+主鍵+索引=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表數(shù)據(jù)+主鍵=19M+9.8M=28.8M
varchar表數(shù)據(jù)+主鍵=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表數(shù)據(jù)=19M
varchar表數(shù)據(jù)=20M
=====================================================================
總結(jié):針對MYISAM引擎,如果使用varchar字符類型,增加索引的容量要小于不加索引的。
?
轉(zhuǎn)載于:https://blog.51cto.com/liang3391/823326
總結(jié)
以上是生活随笔為你收集整理的char与varchar区别(MYISAM)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AgileEAS.NET SOA 中间件
- 下一篇: 100c之23:两个平方数