MYSQL中varchar和text的区别
mysql中varchar和text最大长度都是65535,都是变长,varchar字段长度超过255,创建单列索引就会报错,也无法使用索引
那我们为什么在不需要索引的情况下不直接使用text呢
1, 由于MySQL的内存临时表不支持BLOB、TEXT类型,如果包含该类型列的查询需要用到临时表,就会使用基于磁盘的临时表,性能将会急剧降低。
PS: InnoDB只将767字节的文本或BLOB放入内联,其余的放入其他块中。
所以,编写查询语句时,如果没有必要包含BLOB、TEXT列,就不要写入查询条件。
规避的办法:
使用substring()函数。
设置MySQL变量tmpdir,把临时表存放在基于内存的文件系统中。如Linux下的tmpfs。可以设置多个临时表的路径(用分号分隔),MySQL将使用轮询的方式。
优化的方法:
如果必须使用,可以考虑拆分表,把BLOB、TEXT字段分离到单独的表。
如果有许多大字段,可以考虑合并这些字段到一个字段,存储一个大的200kb比存储20个10kb更高效。
考虑使用compress(),或者在应用层进行压缩,再存储到BLOB字段中。
————————————————
版权声明:本文为CSDN博主「若水如斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shefin90/article/details/124650501
2,排序
max_sort_length:如果排序BLOB、TEXT字段,则仅排序前max_sort_length个字节。
3,索引
上面说过的不能创建索引
text字段,MySQL不允许有默认值。建立索引必须给出前缀索引长度.
varchar允许有默认值,对索引长度没限制,
4,不影响单行65535字节长度限制
即不影响所有字段定义长度的和,当然也不是完全没有。当然超长的varchar也会存储到磁盘。
本质是溢出存储,innodb默认只会存放前768字节在数据页中,而剩余的数据则会存储在溢出段中,虽然也受单表65535最大行宽度限制,但mysql表中每个BLOB和TEXT列实际只占其中的5至9个字节,其他部分将进行溢出存储.所以实际占用表最大行宽度为9+2字节,外加的是额外开销,跟表的实际宽度没有关系.
————————————————
版权声明:本文为CSDN博主「郑志恒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_35631730/article/details/113136813
更多请访问梯哥哥