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

时间: 2024-09-29 02:50:01

MYSQL 磁盘临时表和文件排序的相关文章

mysql 创建大量磁盘临时表

发现 mysql 中创建的临时表基本都是磁盘临时表,对此进行排查.最后为临时表机制说明. 通过查看 mysql 状态变量,看到创建的临时表基本都是磁盘临时表. 查看临时表配置,默认配置 16M,配置并没有问题. 创建两个表,做一个查询测试 create table t1(f1 int auto_increment primary key, f2 char(50), f3 datetime default now()); insert into t1 (f2) values ('赵'),('钱')

MySQL系统临时表、用户临时表

MySQL临时表分为系统使用的临时表和用户使用的临时表. 系统使用的临时表是指MySQL在执行某些SQL语句时需要依赖临时表来完成整个过程.系统使用的临时表的情况可以分为以下几种: *  group by和order by中的列不相同,例如:ORDERY BY price GROUP BY name: *  order by的列或者group by的列不是引用from 表列表中 的第一表,例如:SELECT * from TableA, TableB ORDER BY TableA.price

MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)

官网说:从5.7.18开始不在二进制包中提供my-default.cnf文件.参考:https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html 经过测试,在5.7.18版本中,使用tar.gz安装时,也就是压缩包解压出来安装这种,已经不再需要my.cnf文件也能正常运行. my.cnf文件就是把在命令行上启动MySQL时后面的参数用cnf文件配置好,那么下载启动时就不再需要在命令上加如参数. 这个my.cnf文件可以是自定义位

MySQL ·InnoDB 文件系统之文件物理结构

从上层的角度来看,InnoDB层的文件,除了redo日志外,基本上具有相当统一的结构,都是固定block大小,普遍使用的btree结构来管理数据.只是针对不同的block的应用场景会分配不同的页类型.通常默认情况下,每个block的大小为 UNIV_PAGE_SIZE,在不做任何配置时值为16kb,你还可以选择在安装实例时指定一个块的block大小.对于压缩表,可以在建表时指定block size,但在内存中表现的解压页依旧为统一的页大小. 从物理文件的分类来看,有日志文件.主系统表空间文件ib

[转载]mysql创建临时表,将查询结果插入已有表中

今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取.我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些.然后还需要将查询的结果存储到临时表中.下面是创建临时表以及插入数据的例子,以供大家参考. A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      name VARCHAR(10)

MySQL 架构组成--物理文件组成 for mysql6.7.13

http://hongge.blog.51cto.com/ 一.MySQL Server 简介 什么是MySQL MySQL 是由MySQL AB 公司(目前已经被SUN 公司收归麾下)自主研发的,目前IT 行业 最流行的开放源代码的数据库管理系统之一,它同时也是一个支持多线程高并发多用户的关 系型数据库管理系统. MySQL 数据库以其简单高效可靠的特点,在最近短短几年的时间就从一个名不见经传的 数据库系统,变成一个在IT 行业几乎是无人不知的开源数据库管理系统.从 小型的web 网站,至大型

22.Mysql磁盘I/O

22.磁盘I/O问题磁盘IO是数据库性能瓶颈,一般优化是通过减少或延缓磁盘读写来减轻磁盘IO的压力及其对性能的影响.增强磁盘读写性能和吞吐量也是重要的优化手段. 22.1 使用磁盘阵列 RAID(Redundant Array of Inexpensive Disk)是指廉价磁盘冗余阵列,即磁盘阵列. RAID按照一定的策略将数据分布到若干物理磁盘上,增加数据存储的可靠性,提高数据的读写整体性能,实现了数据的并行读写. 22.1.1 常见RAID级别及其特性 根据数据分布和冗余方式,RAID分为

mysql创建临时表,将查询结果插入已有的表

A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      name VARCHAR(10) NOT NULL,       time date  NOT NULL  )更高级点就是:create temporary  TABLE `temtable` (  `jws` varchar(100) character set utf8 collate utf8_bi

MySQL 架构组成--物理文件组成

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.MySQL Server 简介 什么是MySQL? 答:是目前IT行业最流行的开放源代码的数据库管理系统之一,它同时也是一个支持多线程高并发多用户的关系型数据库管理系统. 特点: 简单:安装简单 高效:读写性能高,仅次于oracle 可靠:运行稳定 MySQL 与其他数据库的简单比较: 1)       功能比较 2)       易