zoukankan      html  css  js  c++  java
  • HOW MYSQL USES INTERNAL TEMPORARY TABLES

    HOW MYSQL USES INTERNAL TEMPORARY TABLES

    通过阅读MySQL的官方手册,我们可以知道出现下面情况的时候,MySQL可能会使用临时表,下面的例子都在MySQL5.6版本下面进行测试,创建测试数据表结构:

    1)UNION queries

    UNION queries use temporary tables.使用UNION语句的时候会使用临时表,在MySQL5.5版本以前explain的extra是不显示Using temporary信息的,但在5.6版本以后会有该信息显示,无论哪个版都都会增加.eg:

    2)Some views

    Some views require temporary tables, such those evaluated using the TEMPTABLE algorithm, or that use UNION or aggregation.一些使用临时表算法或者Union,聚合函数,临时表算法的视图,eg:

    1、Union 算法

    2、聚合函数,可能在explain中看不到Using temporary状态,其实derived2就是一个临时表,一定要注意

    3、临时表算法

    3)SQL_SMALL_RESULT

    If you use the SQL_SMALL_RESULT option, MySQL uses an in-memory temporary table, unless the query also contains elements (described later) that require on-disk storage.使用SQL_SMALL_RESULT选项的query,SELECT语句中指定了SQL_SMALL_RESULT关键字 SQL_SMALL_RESULT的意思就是告诉MySQL,结果会很小,请直接使用内存临时表,不需要使用索引排序 SQL_SMALL_RESULT必须和GROUP BY、DISTINCT或DISTINCTROW一起使用 一般情况下,我们没有必要使用这个选项,让MySQL服务器选择即可,这个例子我没有做出来

    4) Multiple-table UPDATE

    Multiple-table UPDATE statements,多表的update 查询,该查询在extra也不显示Using temporary的状态信息

    5)Derived tables

    Derived tables (subqueries in the FROM clause).使用Derived tables,一般情况子查询会出现该情况,不过5.6版本有改进,可以查阅相关文档

    6)subquery or semi-join

    Tables created for subquery or semi-join , 这个主要是为子查询和物化semi-join创建的表,这个例子也没有做出来

    7)order by,group by,distinct

    最终要的就是group by ,distinct, order by这几组关键字的配合,会出现临时表,文件排序,我来总结一下:

    1、单表情况
    1.单表无索引(order by,group by,distinct列无可用索引),order by 单列或者多列都不使用临时表,只用到Using filesort, show status like ‘Created_tmp_tables’的计数器也不变,group by, distinct 不管是单列还是多列,均使用临时表,下面是例子

    2.单表有索引情况(order by,group by,distinct列有可用索引)在能够使用索引的情况下,那么都不会出现使用临时表的状态

    通过上面的例子,我们可以看出来,无论有无索引可以使用,在单表情况下,order by是不影响临时表的使用的,对于 group by, distinct后面只要有非使用上的索引列的字段,必然会使用临时表

    2)多表情况
    1.多表无可用索引(order by,group by,distinct列无可用索引),只有对驱动表字段排序事才会不使用临时表,其他情况均要使用临时表

    2.多表有可用索引(order by,group by,distinct列有可用索引)

    从上面来看,多表操作的时候, 当order by ,group by 后面出现了非驱动表的可使用索引字段,那么必然会使用临时表,而select后面的字段出现了非可用索引字段的时候,也要使用到临时表,select后面的字段不影响order by的索引使用情况
    对于distinct,除非通过group有效的消除,否则多表连接必然会出现使用临时表.

    参考文章:

    1) http://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html


  • 相关阅读:
    vsftp部署和优化错误
    部署和调优 1.6 vsftp部署和优化-2
    部署和调优 1.5 vsftp部署和优化-1
    部署和调优 1.3 pureftp部署和优化-2
    Linux一些常用软件的源码安装
    SecureCrt 利用公匙登录L机取消密码登录。
    利用任务自动上传备份。
    Mysql Too Many Connections问题解决
    Linux ---pptpd部署
    Sed简单入门实例
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5678302.html
Copyright © 2011-2022 走看看