python的赋值实际上是一种浅拷贝,java赋值是深拷贝还是浅拷贝
blobtext和blobtext都是为文本存储大数据而设计的字符串数据类型,分别以二进制格式和字符格式存储。
实际上,它们属于两个不同的数据类型家族。
字符有TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT和LONGTEXT;对应的二进制类型有TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB和LONGBLOB。BLOB是SMALLBOLB的同义词,TEXT是SMALLTEXT的同义词。
与其他类型不同,MySQL将每个BLOB和文本的值视为一个独立的对象。存储引擎通常在保存时执行特殊处理。如果BLOB和TEXT的值太大,InnoDB将使用一个专用的“外部”存储区域进行存储。在这种情况下,每个值必须在行中包含一个1到4字节的指针,并且实际值必须存储在外部存储区域中。
BLOB文本和BLOB文本系列的区别在于,BLOB类型存储二进制数据,并且没有排序规则或字符集。另一方面,文本类型有字符集和排序规则。
在MySQL中,对BLOB列和TEXT列的排序不同于其他类型。这意味着只对每一列开头的max_sort_length字节进行排序,而不是整个字符串。如果只需要对第一个字符的一部分进行排序,请减少max_sort_length设置或使用order by substring (column,length)。
在MySQL中,不能索引BLOB列和TEXT列中所有长度的字符串,也不能用这些索引来排除排序。
磁盘临时表和文件排序
因为内存引擎不支持BLOB和TEXT类型,所以如果查询需要使用BLOB或TEXT列和隐式临时表,即使只有几行数据,也可以使用MyISAM磁盘临时表。
这将导致严重的性能开销。配置MySQL和在RAM磁盘上存储临时表仍然需要许多昂贵的系统调用。
最佳解决方案是尽可能避免使用BLOB和TEXT类型。如果无法避免,有一种技术可以在所有使用BLOB字段的地方使用substring(column,length)将列值转换为字符串,这样在ORDER BY子句中也可以使用。但是,请确保片段的子串足够短,以便临时表的大小不超过max_heap_table_size或tmp_table_size。如果是,MySQL会将临时内存表转换成临时MyISAM磁盘表。
因为排序时最坏情况的长度分配是相同的,所以当在内存中创建大型临时表和文件排序以及在磁盘上创建大型临时表和文件排序时,此方法非常有用。
例如,假设您有一个包含1000万行的表,它占用了几GB的磁盘空间。有utf8字符集的varchar(1000)列。每个字符最多需要3个字节,最少需要3000个字节。按ORDER BY使用此列。当查询扫描整个表时,需要一个30GB以上(1000万行* 3000字节)的临时表进行排序。如果解释执行计划的额外列包含“Using temporary”,则该查询使用隐式临时表。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。