对比char和varchar随便在google或百度中搜一下得到的结论大概都是"char定长,varchar不定长,char要比varchar占用更多的空间,由于定长char的效率高于varchar,char最大255,varchar最大65536"更高级一点的数据是"char在存入和取出的时候,会自动把末尾的空格去掉,varchar会额外的多用1-2个字节来存放字符长度,列中有一个varchar会自动把char转换成varchar,而当varchar长度小于4时,自动的把varchar转换成char..."一般认为空间换时间,现在磁盘又大又不值钱!当使用全表都是char这的字段的时候,那么表属性Row_format是Fixed也就是静态表,与之对应的自然就是动态表Dynamic,静态表比动态表效率要高,主要是因为,基于两点:1)没有碎片,每行的长度是固定,所以在频繁更新的场景下,尤其是某个字段由小变大.2)方便数据文件指针的操作,在myisam中有一个数据文件指针的概念,是用来指向数据文件,比如在索引中指向数据文件.静态表的偏移量的固定不变的,而在动态表中每行的数据长度大小不一,就可能导致数据更多的开销基于以上两点,所以静态表在查询,修改拥有较大优势,但是这个优势也是有适用场景的.首先猜想char由于每次存取都会自动的削掉末尾的空格,而且数据文件也大,所以会使用更多的cpu和内存资源,尤其在取的时候,要是长短差距较大的时候,还是会很浪费操作的.其次验证想法,首先测试插入性能,建了2张表并调用sp分别插入200W的数据CREATE TABLE `isam_char` (`content` char(255) NOT NULL) ENGINE=MyISAM  DEFAULT CHARSET=utf8;CREATE TABLE `isam_vc` (`content` varchar(255) NOT NULL) ENGINE=MyISAM  DEFAULT CHARSET=utf8;call insert_isam(2000000,'isam_char');call insert_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中,无索引,禁闭query_cachetruncate table isam_char;##观察了下数据文件,被穷空成0insert into isam_char select * from isam_vc;##观察了下数据文件,依然是1.4Gselect * from isam_char limit 1555555,5;select * from isam_vc limit 1555555,5;依旧多次查询去平均值,isam_char表平均值为10.50s,而isam_vc则为1.51s!再看下创建索引,以及索引的使用情况mysql> create index index_char on isam_char(content);Query OK, 2000001 rows affected (2 min 56.33 sec)Records: 2000001  Duplicates: 0  Warnings: 0mysql> create index index_vc on isam_vc(content);Query OK, 2000001 rows affected (1 min 31.98 sec)Records: 2000001  Duplicates: 0  Warnings: 0mysql> select count(*) from isam_char where content=('iamauperman!iwillbeahero!!');+----------+| count(*) |+----------+|   199669 |+----------+1 row in set (0.56 sec)mysql> select count(*) from isam_vc where content=('iamauperman!iwillbeahero!!');+----------+| count(*) |+----------+|   199669 |+----------+1 row in set (0.31 sec)还是不理想,所以在长度很不固定情况下使用char或静态表是很不理想的事,当然这里做的是全索引扫描,动态表的索引要小于动态表,估计最大的优势是使用索引去找数据和update,为了验证,再次测试update.mysql> update isam_char set content='iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!';Query OK, 2000001 rows affected (54 min 54.25 sec)Rows matched: 2000001  Changed: 2000001  Warnings: 0mysql> update isam_vc set content='iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!iwillbeahero!!iamauperman!';Query OK, 2000001 rows affected (1 hour 59 min 25.73 sec)Rows matched: 2000001  Changed: 2000001  Warnings: 0果然啊,更新200W的数据差了1倍多!同时动态表的数据增大为480.7M.顺便读了几次数据,依然有差距mysql> select count(*) from isam_vc IGNORE INDEX(index_vc) where content='iamauperman!iwillbeahero!!';+----------+| count(*) |+----------+|        0 |+----------+1 row in set (10.55 sec)mysql> select count(*) from isam_char IGNORE INDEX(index_char) where content='iamauperman!iwillbeahero!!';+----------+| count(*) |+----------+|        0 |+----------+1 row in set (14.98 sec)不使用索引,做全表扫描,动态表快于静态表,这可能是数据文件大小的差异吧.由于数据源和时间的问题,今天就不做扫描完索引再去读数据的实验了.基本得出结论:mysql里,准确的说是myisam引擎中,静态表又或者char的长处在于更新操作,读取(不使用索引读取)和插入相比varchar又或动态表,并无优势.本测试环境为winXP+mysql-5.1.44-community,配置为mysql默认配置.无修改.注:做这个测试说明我好奇心很强,还有就是我真的很无聊,假如你看了,觉得错了,有明显漏洞的地方,欢迎指正!你也别骂我,我知道我是菜鸟,mysql程序不是有个选项叫做—i-am-a-dummy吗,我就是一个dummy,呵呵,浪费你的时候,我知道我错了!附:插数据的spCREATE DEFINER=`root`@`localhost` PROCEDURE `insert_isam`(p int,t char(10))beginset @i = 0;set @str = "iamauperman!iwillbeahero!!";repeat#select name into @str from mysql.help_topic order by rand() limit 1;set @str=substr(@str,1,25);set @ins_str = repeat(@str,floor(rand()*10));set @cmd=concat('insert into ',t,' (content) values("',@ins_str,'")');prepare stmt from @cmd;execute stmt;set @i = @i+1;until @i > p end repeat;end

mysql varchar 效率_由MySQL中char和varchar效率想到的相关推荐

  1. mysql nvarchar用什么代替_mysql中char、varchar、nvarchar数据类型的用法区别

    mysql中char.varchar.nvarchar数据类型的用法区别 mysql中char.varchar.nvarchar数据类型的用法区别: 说明: 1.char: 固定长度的非 Unicod ...

  2. java 验证时间格式 效率_有关Java中日期格式化的效率实录

    java中格式化日期为固定格式的字符串,无外乎有两种方法:DateFormat 和String.format(JDK1.5+) 但是哪个方法效率更高呢?本人做了一个实验,发现了一个很有趣的现象. 当系 ...

  3. mysql中nchar_浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

    1,定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度,存储ANSI字 ...

  4. mysql中char与varchar的区别分析(补充一句,int和integer没区别)

    转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  5. MySQL中VARCHAR最大长度是多少?CHAR和VARCHAR有哪些区别?

    以我多年经验来看,VARCHAR的最大长度.字符串类型选择,用MySQL的人中十之七八是不清楚的. 本文不止介绍了原理,还提供了案例手把手教你自己分析,彻底解决你的疑惑. 假设有个VARCHAR(64 ...

  6. mysql中char与varchar的区别分析

    原文网址:http://www.jb51.net/article/23575.htm mysql中char与varchar的区别分析 作者: 字体:[增加 减小] 类型:转载 在mysql教程中cha ...

  7. mysql in varchar_MySQL中char和varchar有啥区别?优缺点是啥?

    在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 c ...

  8. MySQL中char,varchar和text的区别

    MySQL中char,varchar和text的区别 java程序中的string类型,在mysql数据表中可以有三种对应的类型:char,varchar和text. char,varchar和tex ...

  9. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  10. python中char是什么意思_MySQL中char和varchar的区别是什么

    MySQL中char和varchar的区别是什么 区别一.定长和变长的区别 1.char 表示定长,长度固定: 2.varchar表示变长,即长度可变. 当所插入的字符串超出它们的长度时,视情况来处理 ...

最新文章

  1. Apache Kylin在绿城客户画像系统中的实践
  2. Python 【第十三章】 Django 之 FORM
  3. Linux静态库和动态库学习总结
  4. quartz.net 执行后台任务
  5. functools.reduce() 函数(不同于einops.reduce)
  6. HTML5学习笔记简明版(8):新增的全局属性
  7. 删除Terminating状态的Pod
  8. python并行计算_Python并行计算初探
  9. python的内存管理机制及调优手段_Python的内存管理机制及调优手段?
  10. 银河麒麟 安卓nginx_银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP
  11. PHP—使用MYSQL来登陆用户
  12. OpenGL学习笔记(14)像素操作
  13. SCCM部署前的IIS、WSUS等准备
  14. 数学魔鬼表达式——第一天
  15. tkmybatis能连接oracle吗,《放弃Mybatis使用tkMybatis》
  16. python SMTP发送带图片的邮件时,报TypeError: Could not guess image MIME subtype错误的解决办法
  17. python爬取链家_Python爬取链家北京二手房数据
  18. 一篇13年前的采访|庚顿首席科学家孙宝元:从数据融合起步,瞄准创造价值,打造助力智能化生产的利器
  19. Queue Map 武魂融合技:MapQueue
  20. 【Oracle】导入/导出DMP文件

热门文章

  1. [原创]简单即是美:QQ2009英文版
  2. VB6实现的自动停靠窗体
  3. Mybatis 原始Dao层开发
  4. Bootstrap3 下拉菜单及其调用方式
  5. Bootstrap Glyphicons图标
  6. CSS 两栏布局之总体设计
  7. Git笔记(7) 撤消操作
  8. oracle9i 全库备份,Windows下Oracle9i数据库文件如何自动备份?
  9. php version 5.5.17-1~dotdeb.1,Ubuntu 12.04使用Dotdeb安装PHP5.4 / Nginx1.4/Redis2.6等新版本
  10. Hibernate二次学习一----------搭建Hibernate