日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

char与varchar区别(MYISAM)

發(fā)布時間:2025/3/8 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 char与varchar区别(MYISAM) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Char屬于固定長度的字符類型,而varchar屬于可變長的字符類型。

下表將各種字符串值保存到char(4)varchar4)列后的結(jié)果,說明了charvarchar之間的差別

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中,不同的存儲引擎對charvarchar的使用原則有所不同,這里簡單概括若下:

??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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。