MySQL内部临时表策略_MySQL

Jun 01, 2016 pm 01:41 PM
戦略 表面

bitsCN.com
MySQL内部临时表策略 通过对MySQL数据库源码的跟踪和调试,以及参考MySQL官方文档,对MySQL内部临时表使用策略进行整理,以便于更加深入的理解。使用内部临时表条件     MySQL内部临时表的使用有一定的策略,从源码中关于SQL查询是否需要内部临时表。可以总结如下:     1、DISTINCT查询,但是简单的DISTINCT查询,比如对primary key、unique key等DISTINCT查询时,查询优化器会将DISTINCT条件优化,去除DISTINCT条件,也不会创建临时表;     2、不是第一个表的字段使用ORDER BY 或者GROUP BY;      3、ORDER BY和GROUP BY使用不同的顺序;     4、用户需要缓存结果;         5、ROLLUP查询。      源码如下所示     代码地址:sql_select.cc:854,函数: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.  */      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 )); 内部临时表使用原则     但是使用了内部临时表,那么他是怎么存储的呢?原则是这样的:     1、当查询结果较小的情况下,使用heap存储引擎进行存储。也就是说在内存中存储查询结果。     2、当查询结果较大的情况下,使用myisam存储引擎进行存储。     3、当查询结果最初较小,但是不断增大的情况下,将会有从heap存储引擎转化为myisam存储引擎存储查询结果。          什么情况算是查询结果较小呢?从源码中if的几个参数可以看出:     1、有blob字段的情况;     2、使用唯一限制的情况;     3、当前表定义为大表的情况;     4、查询结果的选项为小结果集的情况;     5、查询结果的选项为强制使用myisam的情况。              源码如下所示     代码地址:sql_select.cc:10229,函数: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 ());  }        代码地址:sql_select.cc:11224,函数: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 ;  }官方文档相关内容     以上内容只是源码表面的问题,通过查询MySQL的官方文档,得到了更为权威的官方信息。     临时表创建的条件:     1、如果order by条件和group by的条件不一样,或者order by或group by的不是join队列中的第一个表的字段。     2、DISTINCT联合order by条件的查询。     3、如果使用了SQL_SMALL_RESULT选项,MySQL使用memory临时表,否则,查询询结果需要存储到磁盘。     临时表不使用内存表的原则:     1、表中有BLOB或TEXT类型。     2、group by或distinct条件中的字段大于512个字节。     3、如果使用了UNION或UNION ALL,任何查询列表中的字段大于512个字节。              此外,使用内存表最大为tmp_table_size和max_heap_table_size的最小值。如果超过该值,转化为myisam存储引擎存储到磁盘。
 参考资料:1、MySQL源码:MySQL-5.5.202、MySQL官方文档:http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html  作者 king_wangheng bitsCN.com

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPフラッシュセールシステムにおける価格戦略とプロモーション設計のポイント PHPフラッシュセールシステムにおける価格戦略とプロモーション設計のポイント Sep 19, 2023 pm 02:18 PM

PHPフラッシュセールシステムにおける価格戦略とプロモーション設計のポイント フラッシュセールシステムでは、価格戦略とプロモーション設計が非常に重要な部分となります。リーズナブルな価格戦略と適切に設計されたプロモーションにより、ユーザーがフラッシュ セール活動に参加するようになり、ユーザー エクスペリエンスとシステムの収益性が向上します。ここでは、PHPフラッシュセールシステムにおける価格戦略と販促活動設計のポイントを具体的なコード例とともに詳しく紹介します。 1. 価格戦略設計のポイント: ベンチマーク価格を決定する: フラッシュ セール システムでは、ベンチマーク価格は通常販売されるときの商品の価格を指します。存在する

exeからphpへ:機能拡張を実現する効果的な戦略 exeからphpへ:機能拡張を実現する効果的な戦略 Mar 04, 2024 pm 09:36 PM

EXE から PHP へ: 機能拡張を実現する効果的な戦略 インターネットの発展に伴い、より幅広いユーザー アクセスとより便利な操作を実現するために、ますます多くのアプリケーションが Web に移行し始めています。その過程で、本来EXE(実行可能ファイル)として動作する機能をPHPスクリプトに変換する需要も徐々に高まっています。この記事では、EXE を PHP に変換して機能拡張を実現する方法と、具体的なコード例を説明します。 EXE を PHP に変換する理由 クロスプラットフォーム対応: PHP はクロスプラットフォーム言語です

Astar ステーキングの原則、収入の解体、エアドロップ プロジェクトと戦略、および運営のナニー レベルの戦略 Astar ステーキングの原則、収入の解体、エアドロップ プロジェクトと戦略、および運営のナニー レベルの戦略 Jun 25, 2024 pm 07:09 PM

目次 Astar Dapp ステーキングの原則 ステーキング収益 潜在的なエアドロップ プロジェクトの解体: AlgemNeurolancheHealthreeAstar Degens DAOVeryLongSwap ステーキング戦略と運用 「AstarDapp ステーキング」は今年初めに V3 バージョンにアップグレードされ、ステーキング収益に多くの調整が加えられましたルール。現在、最初のステーキング サイクルが終了し、2 番目のステーキング サイクルの「投票」サブサイクルが始まったばかりです。 「追加報酬」特典を獲得するには、この重要な段階を把握する必要があります (6 月 26 日まで続く予定で、残りは 5 日未満です)。 Astarステーキング収入を詳しく説明します。

CentOS7 ソフトウェアのインストール手順と戦略の完全な分析 CentOS7 ソフトウェアのインストール手順と戦略の完全な分析 Jan 04, 2024 am 09:40 AM

私が Linux に正式に関わり始めたのは 2010 年で、エントリーレベルのディストリビューションは Ubuntu10.10 で、その後 Ubunu11.04 に移行しました。この期間中、他の多くのメインストリーム ディストリビューションも試しました。研究室に入ってからCentOS5を使い始め、その後CentOS6を使い、現在はCentOS7に進化しました。私は Linux を 4 年間使用していますが、最初の 3 年間はあれこれいじって、多くの時間を無駄にし、多くの経験と教訓を得るのに費やしました。もしかしたら、私はもうかなりの高齢なので、もう面倒なことをする気にはなれなくなったのかもしれませんが、システムを設定した後は使い続けられることを願うばかりです。この記事を書く/読む理由 Linux、特に CentOS を使用する場合、いくつかの落とし穴、または潔癖症の人が許容できないいくつかのことに遭遇することがあります。

MyBatis キャッシュ戦略分析: 1 次キャッシュと 2 次キャッシュのベスト プラクティス MyBatis キャッシュ戦略分析: 1 次キャッシュと 2 次キャッシュのベスト プラクティス Feb 21, 2024 pm 05:51 PM

MyBatis キャッシュ戦略分析: 1 次キャッシュと 2 次キャッシュのベスト プラクティス MyBatis を使用して開発する場合、多くの場合、キャッシュ戦略の選択を検討する必要があります。 MyBatisのキャッシュは主に1次キャッシュと2次キャッシュの2種類に分かれます。第 1 レベルのキャッシュは SqlSession レベルのキャッシュであり、第 2 レベルのキャッシュはマッパー レベルのキャッシュです。実際のアプリケーションでは、これら 2 つのキャッシュを合理的に使用することが、システムのパフォーマンスを向上させる重要な手段となります。この記事では、特定のコード例を使用して MyBatis を分析します。

Windows 7のパスワードポリシーを変更する方法 Windows 7のパスワードポリシーを変更する方法 Dec 23, 2023 pm 10:41 PM

win7 のパスワード ポリシーは、パスワードの形式、パスワードに必要な文字などに関連しています。設定したパスワード ポリシーが複雑すぎると、パスワードを使用するときに非常に面倒になるだけでなく、パスワードの難易度も高くなります。では、Win7 でパスワード ポリシーを変更するにはどうすればよいでしょうか?以下、一緒に見ていきましょう。 Win7 パスワード ポリシー変更チュートリアル 1. キーボードの「win+r」を押して「ファイル名を指定して実行」を開き、「gpedit.msc」と入力します。 2. Enter を押して確認し、ローカル グループ ポリシー エディタに入ります。 3. 図に示されているパスに従って「アカウント ポリシー」を見つけます。 4. ダブルクリックして右側の「パスワード ポリシー」を開きます。 5. 右側でこれらのパスワード ポリシーを設定できます。 (ダブルクリックして開き、編集します) 6. 設定が完了すると、全体的なパスワード ポリシーが表示されます。

PHP ブログ システムのユーザー フィードバックと改善戦略 PHP ブログ システムのユーザー フィードバックと改善戦略 Aug 09, 2023 am 10:58 AM

PHP ブログ システムのユーザー フィードバックと改善戦略 はじめに: インターネットの普及と発展に伴い、ブログは人々が知識や経験を共有する重要な方法となっています。ユーザーのニーズを満たすためには、安定して使いやすく、包括的なブログ システムを開発することが重要です。ただし、ソフトウェアが反復処理を続けるにつれて、ユーザーのフィードバックや提案はシステムの問題の発見やシステムの改善に役立つため、特に重要になります。この記事では、PHP ブログ システムのユーザー フィードバックと改善戦略について説明し、コード例を使用して改善の手順と方法を説明します。

Nginxのセキュリティ管理戦略【実践編】 Nginxのセキュリティ管理戦略【実践編】 Jun 10, 2023 am 10:12 AM

Nginx は、効率的な Web サーバーおよびリバース プロキシ サーバーとして、最新のインターネット アプリケーションで広く使用されています。しかし、Nginx を使用する人の数が増加し続けるにつれて、Nginx のセキュリティ管理の重要性が増しています。 Nginx のセキュリティ管理戦略では、詳細が重要です。この記事では、Nginx サーバーをより適切に保護するために役立つ Nginx のセキュリティ管理戦略 [実践] を紹介します。 DDoS 攻撃の防止 Nginx は DDoS 攻撃を効果的に防止できますが、最大限の効果を得るには設定が必要です

See all articles