资源描述:
《char和varchar在mysql中的效率怎样》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、char和varchar在mysql中的效率怎样 char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)专职优化、域名注册、数据库、网站空间、虚拟主机、服务器托管、vps主机、服务器租用的中国信息港来为你做详细介绍!当使用全表都是ch
2、ar这的字段的时候,那么表属性Row_format是Fixed也就是静态表,与之对应的自然就是动态表Dynamic,静态表比动态表效率要高,主要是因为,基于两点:1)没有碎片,每行的长度是固定,所以在频繁更新的场景下,尤其是某个字段由小变大.2)方便数据文件指针的操作,在myisam中有一个数据文件指针的概念,是用来指向数据文件,比如在索引中指向数据文件.静态表的偏移量的固定不变的,而在动态表中每行的数据长度大小不一,就可能导致数据更多的开销基于以上两点,所以静态表在查询,修改拥有较大优势,但是这个优势也是有适用场景的.首先猜想cha
3、r由于每次存取都会自动的削掉末尾的空格,而且数据文件也大,所以会使用更多的cpu和内存资源,尤其在取的时候,要是长短差距较大的时候,还是会很浪费操作的.其次验证想法,首先测试插入性能,建了2张表并调用sp分别插入200W的数据CREATETABLE`isam_char`( `content`char(255)NOTNULL)ENGINE=MyISAM DEFAULTCHARSET=utf8;CREATETABLE`isam_vc`( `content`varchar(255)NOTNULL)ENGINE=MyISAM DEFAULTC
4、HARSET=utf8;callinsert_isam(2000000,'isam_char');callinsert_isam(2000000,'isam_vc');多次平均isam_char插入200W的数据为138.21s,而isam_vc少了约20s为119.80s,这应该是每次插入的时候,mysql要把char字段填充到255的操作.观察数据文件大小,isam_vc为235.8M而isam_char为1.4G!再测试查询,为了保证两者一致,首先把isam_char中数据删除,再把isam_vc中数据导入isam_char中,
5、无索引,禁闭query_cachetruncatetableisam_char;##观察了下数据文件,被穷空成0insertintoisam_charselect*fromisam_vc;##观察了下数据文件,依然是1.4Gselect*fromisam_charlimit1555555,5;select*fromisam_vclimit1555555,5;依旧多次查询去平均值,isam_char表平均值为10.50s,而isam_vc则为1.51s!再看下创建索引,以及索引的使用情况mysql>createindexindex_ch
6、aronisam_char(content);QueryOK,2000001rowsaffected(2min56.33sec)Records:2000001 Duplicates:0 Warnings:0mysql>createindexindex_vconisam_vc(content);QueryOK,2000001rowsaffected(1min31.98sec)Records:2000001 Duplicates:0 Warnings:0mysql>selectcount(*)fromisam_charwhereconte
7、nt=('iamauperman!iwillbeahero!!');+----------+
8、count(*)
9、+----------+
10、 199669
11、+----------+1rowinset(0.56sec)mysql>selectcount(*)fromisam_vcwherecontent=('iamauperman!iwillbeahero!!');+----------+
12、count(*)
13、+----------+
14、 199669
15、+----------+1rowinset(0.31sec)还是不理想,所以在长度很不
16、固定情况下使用char或静态表是很不理想的事,当然这里做的是全索引扫描,动态表的索引要小于动态表,估计最大的优势是使用索引去找数据和update,为了验证,再次测试update.mysql>updateisam_char