1. はじめに
今度は、単語リストから一度に 3 つの単語をランダムに選択するという要件があります。
このテーブルのテーブル作成ステートメントは次のとおりです:
mysql> Create table 'words'( 'id' int(11) not null auto_increment; 'word' varchar(64) default null; primary key ('id') ) ENGINE=InnoDB;
次に、そこに 10,000 行のデータを挿入します。次に、その中からランダムに 3 つの単語を選択する方法を見てみましょう。
2. メモリ一時テーブル
まず、通常、このロジックを実装するには、order by rand() を使用することを考えます:
mysql> select word from words order by rand() limit 3;
この文は非常に単純ですが、しかし、実行プロセスはより複雑です。 Explain を使用してステートメントの実行を確認します。
「Extra」フィールドで「temporary」を使用すると、一時テーブルを使用する必要があることを示し、「filesort を使用」は並べ替えが必要であることを示します。 。つまり、ソート操作が必要となる。
InnoDB テーブル の場合、フィールド全体の並べ替えを実行するとディスク アクセスが軽減されるため、これが推奨されます。
#メモリ テーブルの場合、テーブルを返すプロセスは単にメモリに直接アクセスして、データ行の位置に基づいてデータを取得するだけであり、結果は発生しません。複数のディスクへのアクセスはまったくありません。したがって、現時点では MySQL は ROWID ソートを優先します。
一時テーブルを作成します。このテーブルはメモリを使用します。 Engine では、テーブルに 2 つのフィールドがあります。最初のフィールドは double 型で、R とマークされ、2 番目のフィールドは varchar(64) 型で、W とマークされています。そして、このテーブルにはインデックスがありません。
- 単語テーブルから主キー順にすべての単語を取り出します。単語ごとに、 rand() 関数を呼び出して、0 より大きく 1 未満のランダムな 10 進数をランダムに生成し、そのランダムな 10 進数と単語を一時テーブルの R フィールドと W フィールドにそれぞれ保存します。
- 次のステップは、フィールド R
- sort_buffer に従って並べ替えることです。 sort_buffer には double 型と整数フィールドが含まれます。
- 一時メモリテーブルから R 値と位置情報を 1 行ずつ取り出し、sort_buffer の 2 つのフィールドにそれぞれ格納します。
- sort_buffer は R 値に従ってソートされます
- ソートが完了すると、最初の 3 つの結果の位置情報が取り出され、そして、対応する情報がメモリ一時テーブルから取り出され、単語がクライアントに返されます。
上記の位置情報は、実際には行の位置です。つまり、これは前に説明した ROWID です。
InnoDB エンジンの場合、主キーの有無にかかわらず、テーブルに対して 2 つの処理方法があります。- 主キーのある
InnoDB テーブルの場合たとえば、この ROWID は主キー IDです。
- 主キーのない
InnoDB テーブルの場合、この ROWID はシステムによって生成され、さまざまな行を識別するために使用されます。 。
したがって、
を使用します。 3. ディスク一時テーブル
すべての一時テーブルがメモリ一時テーブルであるわけではありません。 tmp_table_size 設定により、メモリ一時テーブルのサイズが制限されます。このサイズを超えると、ディスク一時テーブルが使用されます。 InnoDB エンジンはデフォルトでディスク一時テーブルを使用します。 4. プライオリティ キュー ソート アルゴリズム
MySQL5.6 以降、
プライオリティ キュー ソート アルゴリズムが導入され、一時ファイルを使用する必要はありません。元のマージ ソート アルゴリズムでは、一時ファイルの使用が必要です。マージ アルゴリズムを使用する場合、実際には上位 3 つを取得するだけで済みますが、マージ ソートが不足すると、全体がすでに整っていて、リソースの無駄が発生するためです。
プライオリティ キュー ソート アルゴリズムでは、上位 3 つだけを取得できます。実行プロセスは次のとおりです: これらの 10,000 (R、rowid) をソートするには、上位 3 つが最初に取得されます。3 つの行がヒープに構築され、最大値がヒープの先頭に配置されます。- 次の行 (R’, rowid’) を取得します。現在のヒープ内の最大の R と比較します。R' が R より小さい場合は、(R, rowid) をヒープから削除し、(R', rowid') に置き換えます。
- 上記のプロセスを繰り返します。
- プロセスは次の図に示されています。
ただし、制限数が比較的大きい場合、ヒープを維持するため、マージ ソート アルゴリズムが使用されます。
以上がMySQL でランダム抽出を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

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

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ホットトピック









