MYSQL磁盘临时表和⽂件排序
因为Memory引擎不⽀持BOLB和TEXT类型,所以,如果查询使⽤了BLOB或TEXT列并且需要使⽤隐式临时表,将不得不使⽤MyISAM 磁盘临时表,即使只有⼏⾏数据也是如此。
这会导致严重的性能开销。。即使配置Mysql将临时表存储在内存块设备上(ram-disk),依然需要很多昂贵的系统调⽤。
最好的解决⽅案是尽量避免使⽤BLOB和TEXT类型。如果实在⽆法避免,有⼀个技巧是在所有⽤到BLOG字段的地⽅都使⽤SUBSTRING(culumn,length)将列值转换为字符串(在order by ⼦句中也适⽤),这样就可以使⽤内存临时表了。但是要确保截取的字符串⾜够短,不会使临时表的⼤⼩超过max_heap_table_size或temp_table_size,超过以后,mysql会将内存临时表转换为myisam 磁盘临时表。 最坏情况下的长度分配对于排序的时候也是⼀样的,所以这⼀招对于内存中创建⼤临时表和⽂件排序,以及在磁盘上创建⼤临时表和⽂件排序这两种情况都很有帮助。
例如,假设有⼀个1000W⾏的表,占⽤了⼏个GB的磁盘空间。其中有⼀个utf-8字符集的varchar(1000)列每个字符最多使⽤3个字节,最坏情况下需要3000字节的空间。如果ORDER BY 中⽤到了这个列,并且查询扫描了整个表,为了排序就需要超过30Gb的临时表。
字符串长度排序 如果EXPLAIN执⾏计划的EXTRA列包含‘Using temporary’,则说明这个查询使⽤了隐⼠临时表。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论