真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL內(nèi)部臨時表策略的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)MySQL內(nèi)部臨時表策略的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

為洛隆等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及洛隆網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站制作、洛隆網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

MySQL內(nèi)部臨時表策略
 
通過對MySQL數(shù)據(jù)庫的跟蹤和調(diào)試,以及參考MySQL官方文檔,對MySQL內(nèi)部臨時表使用策略進(jìn)行整理,以便于更加深入的理解。
使用內(nèi)部臨時表條件
     MySQL內(nèi)部臨時表的使用有一定的策略,從源碼中關(guān)于SQL查詢是否需要內(nèi)部臨時表。可以總結(jié)如下:
     1、DISTINCT查詢,但是簡單的DISTINCT查詢,比如對primary key、unique key等DISTINCT查詢時,查詢優(yōu)化器會將DISTINCT條件優(yōu)化,去除DISTINCT條件,也不會創(chuàng)建臨時表;
     2、不是第一個表的字段使用ORDER BY 或者GROUP BY; 
     3、ORDER BY和GROUP BY使用不同的順序;
     4、用戶需要緩存結(jié)果;  www.2cto.com  
     5、ROLLUP查詢。
 
     源碼如下所示
     代碼地址:sql_select.cc:854,函數(shù):JOIN::optimize(),位置:sql_select.cc:1399
  /*
    Check if we need to create a temporary table.
    This has to be done if all tables are not already read (const tables)
    and one of the following conditions holds:
    - We are using DISTINCT (simple distinct's are already optimized away)
    - We are using an ORDER BY or GROUP BY on fields not in the first table
    - We are using different ORDER BY and GROUP BY orders
    - The user wants us to buffer the result.
    When the WITH ROLLUP modifier is present, we cannot skip temporary table
    creation for the DISTINCT clause just because there are only const tables.
  */  www.2cto.com  
  need_tmp= (( const_tables != tables &&
               (( select_distinct || !simple_order || !simple_group) ||
                ( group_list && order ) ||
                test(select_options & OPTION_BUFFER_RESULT))) ||
             ( rollup.state != ROLLUP:: STATE_NONE && select_distinct ));
 
內(nèi)部臨時表使用原則
     但是使用了內(nèi)部臨時表,那么他是怎么存儲的呢?原則是這樣的:
     1、當(dāng)查詢結(jié)果較小的情況下,使用heap存儲引擎進(jìn)行存儲。也就是說在內(nèi)存中存儲查詢結(jié)果。
     2、當(dāng)查詢結(jié)果較大的情況下,使用myisam存儲引擎進(jìn)行存儲。
     3、當(dāng)查詢結(jié)果最初較小,但是不斷增大的情況下,將會有從heap存儲引擎轉(zhuǎn)化為myisam存儲引擎存儲查詢結(jié)果。
     
     什么情況算是查詢結(jié)果較小呢?從源碼中if的幾個參數(shù)可以看出:
     1、有blob字段的情況;
     2、使用唯一限制的情況;
     3、當(dāng)前表定義為大表的情況;
     4、查詢結(jié)果的選項為小結(jié)果集的情況;
     5、查詢結(jié)果的選項為強制使用myisam的情況。
       www.2cto.com  
     源碼如下所示
     代碼地址:sql_select.cc:10229,函數(shù):create_tmp_table(),位置:sql_select.cc:10557
  /* If result table is small; use a heap */
  /* future: storage engine selection can be made dynamic? */
  if ( blob_count || using_unique_constraint
      || ( thd->variables .big_tables && !( select_options & SELECT_SMALL_RESULT ))
      || ( select_options & TMP_TABLE_FORCE_MYISAM ))
  {
    share->db_plugin = ha_lock_engine(0, myisam_hton);
    table->file = get_new_handler( share, &table ->mem_root,
                                 share->db_type ());
    if (group &&
          ( param->group_parts > table-> file->max_key_parts () ||
           param->group_length > table-> file->max_key_length ()))
      using_unique_constraint=1;
  }
  else
  {
    share->db_plugin = ha_lock_engine(0, heap_hton);
    table->file = get_new_handler( share, &table ->mem_root,
                                 share->db_type ());
  }
  www.2cto.com  
     代碼地址:sql_select.cc:11224,函數(shù):create_myisam_from_heap(),位置:sql_select.cc:11287
 /*
    copy all old rows from heap table to MyISAM table
    This is the only code that uses record[1] to read/write but this
    is safe as this is a temporary MyISAM table without timestamp/autoincrement
    or partitioning.
  */
  while (! table->file ->rnd_next( new_table.record [1]))
  {
    write_err= new_table .file-> ha_write_row(new_table .record[1]);
    DBUG_EXECUTE_IF("raise_error" , write_err= HA_ERR_FOUND_DUPP_KEY ;);
    if (write_err )
      goto err ;
  }
官方文檔相關(guān)內(nèi)容
     以上內(nèi)容只是源碼表面的問題,通過查詢MySQL的官方文檔,得到了更為權(quán)威的官方信息。
     臨時表創(chuàng)建的條件:
     1、如果order by條件和group by的條件不一樣,或者order by或group by的不是join隊列中的第一個表的字段。
     2、DISTINCT聯(lián)合order by條件的查詢。
     3、如果使用了SQL_SMALL_RESULT選項,MySQL使用memory臨時表,否則,查詢詢結(jié)果需要存儲到磁盤。
     臨時表不使用內(nèi)存表的原則:
     1、表中有BLOB或TEXT類型。
     2、group by或distinct條件中的字段大于512個字節(jié)。
     3、如果使用了UNION或UNION ALL,任何查詢列表中的字段大于512個字節(jié)。
     此外,使用內(nèi)存表最大為tmp_table_size和max_heap_table_size的最小值。如果超過該值,轉(zhuǎn)化為myisam存儲引擎存儲到磁盤。

關(guān)于“MySQL內(nèi)部臨時表策略的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。


本文題目:MySQL內(nèi)部臨時表策略的示例分析
鏈接URL:http://weahome.cn/article/pjcsec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部