什么情况下VARCHAR比CHAR效率高?

申祷无 2013-05-08 10:08:05
之前用CHAR的时候一个查询0点几秒。变成VARCHAR之后0.00几秒。
说一下我的数据库的特点:
数据量非常大,几十万多条。某个字段A,就是上面说的那个,长度非常长,接近255的上限。
另外我上面说的那个差别是在不查询那个字段A的情况下的数据。如果用包含用instr查询那个字段的某个SQL查询的话,VARCHAR是1秒多,CHAR是10秒多。
...全文
385 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
申祷无 2013-05-09
  • 打赏
  • 举报
回复
引用 8 楼 ACMAIN_CHM 的回复:
[quote=引用 7 楼 shendaowu 的回复:] [quote=引用 6 楼 ACMAIN_CHM 的回复:] "" "1131" null "12" "1" 找出 like '%1%' 和 " " "1131 " " " "12 " "1 " ,不谈数据库,这这么两个数组,让你自己写代码在数组中搜索,你的代码会是什么? 哪个速度快?
我会加个表示字符串长度的整型变量。在汇编语言里循环次数已知的循环是不需要额外的指令进行判断的,有专门的指令LOOP。[/quote] 那就按照设想,自己运算一下,给每个VARCHAR加上长度整数。 CAHR的不用加了,都要是相同的。 然后在这些VARCHAR或CHAR中搜索 12345. 看看算法效率对比是什么样 "1" / 长度=2 "1 " / 长度 =100 [/quote] 我昨天搞错了,VARCHAR快的原因好像是我加了ORDER BY的原因,正常只搜索字符串的话还是CHAR快。可见MySQL可能还是对CHAR的搜索进行优化了。 UPDATE tablename SET field1=length(field2) SELECT * FROM tablename WHERE instr(left(field2,field1),'abc') ORDER BY field3 这个是最慢的。 还有今天测的时候速度好像不是10倍了。以后测试的时候还是记录一下吧,不然问题真的很麻烦。
ACMAIN_CHM 2013-05-09
  • 打赏
  • 举报
回复
引用 7 楼 shendaowu 的回复:
[quote=引用 6 楼 ACMAIN_CHM 的回复:] "" "1131" null "12" "1" 找出 like '%1%' 和 " " "1131 " " " "12 " "1 " ,不谈数据库,这这么两个数组,让你自己写代码在数组中搜索,你的代码会是什么? 哪个速度快?
我会加个表示字符串长度的整型变量。在汇编语言里循环次数已知的循环是不需要额外的指令进行判断的,有专门的指令LOOP。[/quote] 那就按照设想,自己运算一下,给每个VARCHAR加上长度整数。 CAHR的不用加了,都要是相同的。 然后在这些VARCHAR或CHAR中搜索 12345. 看看算法效率对比是什么样 "1" / 长度=2 "1 " / 长度 =100
申祷无 2013-05-09
  • 打赏
  • 举报
回复
引用 6 楼 ACMAIN_CHM 的回复:
"" "1131" null "12" "1" 找出 like '%1%' 和 " " "1131 " " " "12 " "1 " ,不谈数据库,这这么两个数组,让你自己写代码在数组中搜索,你的代码会是什么? 哪个速度快?
我会加个表示字符串长度的整型变量。在汇编语言里循环次数已知的循环是不需要额外的指令进行判断的,有专门的指令LOOP。
欢乐的尼美 2013-05-09
  • 打赏
  • 举报
回复
由于上述原因,不能用该快速选择方法执行下面的查询: 1. 除了MIN()或MAX(),还有其它累积函数,例如: SELECT c1, SUM(c2) FROM t1 GROUP BY c1; 2. GROUP BY子句中的域不引用索引开头,如下所示: SELECT c1,c2 FROM t1 GROUP BY c2, c3; 3. 查询引用了GROUP BY部分后面的关键字的一部分,并且没有等于常量的等式,例如: SELECT c1,c3 FROM t1 GROUP BY c1, c2;
ACMAIN_CHM 2013-05-08
  • 打赏
  • 举报
回复
"" "1131" null "12" "1" 找出 like '%1%' 和 " " "1131 " " " "12 " "1 " ,不谈数据库,这这么两个数组,让你自己写代码在数组中搜索,你的代码会是什么? 哪个速度快?
申祷无 2013-05-08
  • 打赏
  • 举报
回复
引用 4 楼 rucypli 的回复:
查询速度相差十倍 未必磁盘空间相差十倍 因为中间还有一层内存缓存的数据
如果全表扫描呢?
rucypli 2013-05-08
  • 打赏
  • 举报
回复
查询速度相差十倍 未必磁盘空间相差十倍 因为中间还有一层内存缓存的数据
申祷无 2013-05-08
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
如果 有很多NULL,则VARCHAR会比CHAR快。 建议楼主提供更详细信息以分析。
你回复这贴的时候怎么就不说有的时候影响很大呢?10倍可绝对不是微小吧? http://bbs.csdn.net/topics/390421712 查询速度相差十倍,占用磁盘空间也相差十倍,这个是巧合么?可以的话请回答一下这个问题: http://bbs.csdn.net/topics/390452088
申祷无 2013-05-08
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
如果 有很多NULL,则VARCHAR会比CHAR快。 建议楼主提供更详细信息以分析。
还真有可能是你说的这个原因。我上面没说清楚,是定义的CHAR的长度非常长,而实际的数据很少有这么长的,大部分都很短,只有1%的长度是超过30的。另外将CHAR改成VARCHAR之后,数据库占用的空间明显减少,类型是VARCHAR的情况下占用100多M的空间,类型是CHAR的情况下只占10多M。 除了这个没有其他原因了么?
ACMAIN_CHM 2013-05-08
  • 打赏
  • 举报
回复
如果 有很多NULL,则VARCHAR会比CHAR快。 建议楼主提供更详细信息以分析。

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧