首页 > 数据库技术 > 详细

MYSQL 磁盘临时表和文件排序

时间:2015-11-17 23:14:44      阅读:377      评论:0      收藏:0      [点我收藏+]

  因为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’,则说明这个查询使用了隐士临时表。

MYSQL 磁盘临时表和文件排序

原文:http://www.cnblogs.com/zhengyanqiu/p/4973105.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!