本帖最后由 qq315224416 于 2012-08-23 18:39:26 编辑

解决方案 »

  1.   

    (1)"这两种数据类型会增加产生磁盘临时表的几率"
    这意思是说有这两种类型有很多sql情况会产生临时表
    (2), "而直接采用磁盘临时表。即使两个数据类型中的列存储的数据不多"
    比如unin的时候必然产生临时表
    (3)select * from t1 where id in (select id from t2)
    这个不产生临时表
    可是还是没有在show status like '%tmp%'显示出使用了磁盘上的临时表
    转瞬即逝的吧
      

  2.   

    临时文件大家都不陌生,就是为了各种不同的目的,产生的中间文件。使用完毕后会被及时
    的回收和清理。临时表也是如此,它是mysql 在进行一些内部操作的时候生成的数据库表。
    这些操作主要包括,group by, distinct,一些order by 查询语句,UNION,一些from 语句中
    的子查询(derived tables)等。例如:
     使用了 order by 子句和一个不同的group by 子句,或者order by(或group by)包含了
    JOIN queue 上非第一个表中的列,临时表将被创建。
     使用了 SQL_SMALL_RESULT 选项,mysql 会使用in‐memory 临时表
     DISTINCT 和order by 一起使用可能会用到临时表
      

  3.   

    1:你的意思正确,大小超过了tmp_table_size 会使用 磁盘临时表,没操作则用内存临时表。
    2:不冲突,这句话还有个条件,如果使用了BLOB和TEXT列,“并且需要隐式临时表时”,直接用磁盘临时表,不会用到内存。即使没有超过max_heap_table_size的限制<他们的类型决定的>,(varchar,char 都会用内存临时表)。
    3:用explain查看,其实你可以在每次执行前 用 explain 分析下,要是让你使用临时表 会在extra里面现实出来的。4:那就表示没有使用临时表。tmp_table_size设置为1024,这个设置的小了,后期明显会出现问题。
      

  4.   

    1. "另外还想问一个问题 select * from t1 where id in (select id from t2)-----------这里子查询生成的结果集是不是放在临时表中的, 还是结果集本身就是一个独立的不同于临时表的概念???"这个应该不需要临时表吧,因为我完全可以select di from t2这个子查询取出一条记录,然后去探测外面的查询。2. “(1)"这两种数据类型会增加产生磁盘临时表的几率"--------------------------------这里的意思似乎是使用text与blob并不一定会生成磁盘上的临时表, 而是大小超过了tmp_table_size才使用临时表”你的表里面包含text/blob字段不一定会使用临时表,除非你使用了text/blob字段,比如select blob_column,也就是说查询中有text/blob字段才会一定使用临时表,因此文章里面就说这两者类型会增大使用临时表的概率,因为你既然表中有text/blob字段,那一定有它的价值,也就有使用它的时候,那时候就必须建临时表了3. (2), "而直接采用磁盘临时表。即使两个数据类型中的列存储的数据不多"--------------------似乎又与第一条的tmp_table_size相冲突
    在第二点我已经说了,查询中使用了text/blob字段一定会使用临时表,但是有一个问题你的注意一下:临时表类型默认是memory的,而memory引擎的字段不支持类型,因此也就自动转化为myisam类型存储在磁盘上了,在文章里作者称为磁盘临时表。所以你即使一个表里只有一行数据,但因为有blob/text字段那么也是会在磁盘上创建临时表的。希望你能理解
      

  5.   

    1. "另外还想问一个问题 select * from t1 where id in (select id from t2)-----------这里子查询生成的结果集是不是放在临时表中的, 还是结果集本身就是一个独立的不同于临时表的概念???"这个应该不需要临时表吧,因为我完全可以select di from t2这个子查询取出一条记录,然后去探测外面的查询。2. “(1)"这两种数据类型会增加产生磁盘临时表的几率"--------------------------------这里的意思似乎是使用text与blob并不一定会生成磁盘上的临时表, 而是大小超过了tmp_table_size才使用临时表”你的表里面包含text/blob字段不一定会使用临时表,除非你使用了text/blob字段,比如select blob_column,也就是说查询中有text/blob字段才会一定使用临时表,因此文章里面就说这两者类型会增大使用临时表的概率,因为你既然表中有text/blob字段,那一定有它的价值,也就有使用它的时候,那时候就必须建临时表了3. (2), "而直接采用磁盘临时表。即使两个数据类型中的列存储的数据不多"--------------------似乎又与第一条的tmp_table_size相冲突
    在第二点我已经说了,查询中使用了text/blob字段一定会使用临时表,但是有一个问题你的注意一下:临时表类型默认是memory的,而memory引擎的字段不支持类型,因此也就自动转化为myisam类型存储在磁盘上了,在文章里作者称为磁盘临时表。所以你即使一个表里只有一行数据,但因为有blob/text字段那么也是会在磁盘上创建临时表的。希望你能理解
      

  6.   

    1. "另外还想问一个问题 select * from t1 where id in (select id from t2)-----------这里子查询生成的结果集是不是放在临时表中的, 还是结果集本身就是一个独立的不同于临时表的概念???"这个应该不需要临时表吧,因为我完全可以select di from t2这个子查询取出一条记录,然后去探测外面的查询。2. “(1)"这两种数据类型会增加产生磁盘临时表的几率"--------------------------------这里的意思似乎是使用text与blob并不一定会生成磁盘上的临时表, 而是大小超过了tmp_table_size才使用临时表”你的表里面包含text/blob字段不一定会使用临时表,除非你使用了text/blob字段,比如select blob_column,也就是说查询中有text/blob字段才会一定使用临时表,因此文章里面就说这两者类型会增大使用临时表的概率,因为你既然表中有text/blob字段,那一定有它的价值,也就有使用它的时候,那时候就必须建临时表了3. (2), "而直接采用磁盘临时表。即使两个数据类型中的列存储的数据不多"--------------------似乎又与第一条的tmp_table_size相冲突
    在第二点我已经说了,查询中使用了text/blob字段一定会使用临时表,但是有一个问题你的注意一下:临时表类型默认是memory的,而memory引擎的字段不支持类型,因此也就自动转化为myisam类型存储在磁盘上了,在文章里作者称为磁盘临时表。所以你即使一个表里只有一行数据,但因为有blob/text字段那么也是会在磁盘上创建临时表的。希望你能理解