免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

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

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

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

MySQL內(nèi)部臨時(shí)表策略
 
通過對(duì)MySQL數(shù)據(jù)庫的跟蹤和調(diào)試,以及參考MySQL官方文檔,對(duì)MySQL內(nèi)部臨時(shí)表使用策略進(jìn)行整理,以便于更加深入的理解。
使用內(nèi)部臨時(shí)表?xiàng)l件
     MySQL內(nèi)部臨時(shí)表的使用有一定的策略,從源碼中關(guān)于SQL查詢是否需要內(nèi)部臨時(shí)表。可以總結(jié)如下:
     1、DISTINCT查詢,但是簡(jiǎn)單的DISTINCT查詢,比如對(duì)primary key、unique key等DISTINCT查詢時(shí),查詢優(yōu)化器會(huì)將DISTINCT條件優(yōu)化,去除DISTINCT條件,也不會(huì)創(chuàng)建臨時(shí)表;
     2、不是第一個(gè)表的字段使用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)部臨時(shí)表使用原則
     但是使用了內(nèi)部臨時(shí)表,那么他是怎么存儲(chǔ)的呢?原則是這樣的:
     1、當(dāng)查詢結(jié)果較小的情況下,使用heap存儲(chǔ)引擎進(jìn)行存儲(chǔ)。也就是說在內(nèi)存中存儲(chǔ)查詢結(jié)果。
     2、當(dāng)查詢結(jié)果較大的情況下,使用myisam存儲(chǔ)引擎進(jìn)行存儲(chǔ)。
     3、當(dāng)查詢結(jié)果最初較小,但是不斷增大的情況下,將會(huì)有從heap存儲(chǔ)引擎轉(zhuǎn)化為myisam存儲(chǔ)引擎存儲(chǔ)查詢結(jié)果。
     
     什么情況算是查詢結(jié)果較小呢?從源碼中if的幾個(gè)參數(shù)可以看出:
     1、有blob字段的情況;
     2、使用唯一限制的情況;
     3、當(dāng)前表定義為大表的情況;
     4、查詢結(jié)果的選項(xiàng)為小結(jié)果集的情況;
     5、查詢結(jié)果的選項(xiàng)為強(qiáng)制使用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)威的官方信息。
     臨時(shí)表創(chuàng)建的條件:
     1、如果order by條件和group by的條件不一樣,或者order by或group by的不是join隊(duì)列中的第一個(gè)表的字段。
     2、DISTINCT聯(lián)合order by條件的查詢。
     3、如果使用了SQL_SMALL_RESULT選項(xiàng),MySQL使用memory臨時(shí)表,否則,查詢?cè)兘Y(jié)果需要存儲(chǔ)到磁盤。
     臨時(shí)表不使用內(nèi)存表的原則:
     1、表中有BLOB或TEXT類型。
     2、group by或distinct條件中的字段大于512個(gè)字節(jié)。
     3、如果使用了UNION或UNION ALL,任何查詢列表中的字段大于512個(gè)字節(jié)。
     此外,使用內(nèi)存表最大為tmp_table_size和max_heap_table_size的最小值。如果超過該值,轉(zhuǎn)化為myisam存儲(chǔ)引擎存儲(chǔ)到磁盤。

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

文章名稱:MySQL內(nèi)部臨時(shí)表策略的示例分析
URL鏈接:http://m.newbst.com/article42/pjcsec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)搜索引擎優(yōu)化網(wǎng)站制作網(wǎng)頁設(shè)計(jì)公司全網(wǎng)營銷推廣Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)