MySQL 8.0 の新しいリレーショナル データベース機能の詳細な説明

MySQL 8.0 の新しいリレーショナル データベース機能の詳細な説明

序文

MySQL 8.0 の最新バージョンは 8.0.4 rc であり、正式版は近日中にリリースされる予定です。この記事では、リレーショナル データベースの 8.0 の主要な新機能をいくつか紹介します。

MySQL はバージョン 5.7 から NoSQL ストレージ機能を提供しており、この機能も 8.0 で改善されたことはすでにご存知かもしれません。ただし、これは実際にはほとんど使用されておらず、私も使用したことがないため、この記事ではこの側面を紹介せず、リレーショナル データベースの側面に焦点を当てます。

1. 隠しインデックス

隠しインデックス機能は、パフォーマンスのデバッグに非常に役立ちます。 8.0 では、インデックスを「非表示」および「表示」できます。インデックスが非表示の場合、クエリ オプティマイザーでは使用されません。

つまり、インデックスを非表示にして、データベースへの影響を観察することができます。データベースのパフォーマンスが低下した場合は、インデックスが有用であることを意味するため、「表示に戻す」ことができます。データベースのパフォーマンスが変化していない場合は、インデックスが冗長であるため、削除できます。

インデックスを非表示にする構文は次のとおりです。

ALTER TABLE t ALTER INDEX i INVISIBLE;

インデックスを復元するための構文は次のとおりです。

ALTER TABLE t ALTER INDEX i VISIBLE;

インデックスが非表示になっている場合、show index コマンドの出力から、インデックスの Visible プロパティ値が NO であることがわかります。

注:インデックスが非表示の場合でも、その内容は通常のインデックスと同様にリアルタイムで更新されます。この機能は、最適化とデバッグ専用です。インデックスを長期間非表示にしている場合は、インデックスの存在が挿入、更新、削除のパフォーマンスに影響を与えるため、インデックスを削除することをお勧めします。

2. 持続性を設定する

MySQL 設定は、SET GLOBAL コマンドを使用して実行時に変更できますが、この変更は一時的なものであり、データベースは次回起動時に構成ファイルを再度読み取ります。

MySQL 8 では SET PERSIST コマンドが追加されました。例:

SET PERSIST max_connections = 500;

MySQL は、このコマンドの設定をデータ ディレクトリの mysqld-auto.cnf ファイルに保存します。次回起動時に、このファイルを読み取り、その中の設定を使用してデフォルトの設定ファイルを上書きします。

3. UTF-8エンコード

MySQL 8 以降、データベースのデフォルトのエンコーディングは、すべての絵文字を含む utf8mb4 に変更されます。長年にわたり、デフォルトのラテン語の変更を忘れて文字化けが発生することを恐れて、MySQL を使用する際のエンコードには細心の注意を払ってきました。これからは心配する必要はありません。

4. 共通テーブル式

複雑なクエリでは埋め込みテーブルが使用されます。例:

t1.*、t2.*を選択します 
 (テーブル1から列1を選択) t1、
 (テーブル2からcol2を選択) t2;

CTE を使用すると、次のように記述できます。

と
 t1 AS (テーブル1から列1を選択)
 t2 AS (テーブル2から列2を選択)
t1.*、t2.*を選択します。 
t1、t2から;

こうすることで、レイヤーと領域がより明確に表示され、どの部分を変更すればよいかがより明確にわかるようになります。

CTE の詳細については、公式ドキュメントを参照してください。

5. ウィンドウ関数

MySQL で最も不満の多かった機能の 1 つは、rank() 関数がないことです。クエリでランキングを実装する必要がある場合は、@ 変数を手動で記述する必要があります。ただし、MySQL 8.0 以降では、ウィンドウ関数と呼ばれる新しい概念が追加され、これを使用していくつかの新しいクエリ メソッドを実装できるようになりました。

ウィンドウ関数は、SUM() や COUNT() などの集計関数に少し似ていますが、クエリ結果の複数行を 1 行に結合するのではなく、結果を複数の行に戻します。つまり、ウィンドウ関数では GROUP BY は必要ありません。

「クラスの生徒数」の表があるとします。

mysql> クラスから * を選択します。
+--------+------------+
| 名前 | 生徒数 |
+--------+------------+
| クラス1 | 41 |
| クラス2 | 43 |
| クラス3 | 57 |
| クラス4 | 57 |
| クラス5 | 37 |
+--------+------------+
セット内の行数は 5 です (0.00 秒)

クラスのサイズを小さいものから大きいものの順にランク付けしたい場合は、次のようにウィンドウ関数を使用できます。

mysql> select *, rank() はクラスから `rank` でした
 -> ウィンドウは (stu_count による順序) でした。
+--------+-----------+------+
| 名前 | 生徒数 | 順位 |
+--------+-----------+------+
| クラス5 | 37 | 1 |
| クラス1 | 41 | 2 |
| クラス2 | 43 | 3 |
| クラス3 | 57 | 4 |
| クラス4 | 57 | 4 |
+--------+-----------+------+
セット内の行数は 5 です (0.00 秒)

ここでは、w という名前のウィンドウを作成し、それを stu_count フィールドをソートするように指定し、select 句で w に対して rank() メソッドを実行して、結果を rank フィールドとして出力します。

実際、ウィンドウの作成はオプションです。たとえば、各行に生徒の総数を加算したい場合は、次のようにします。

mysql> * を選択し、(stu_count) を total_count として合計します。
 -> クラスから;
+--------+-----------+-------------+
| 名前 | 生徒数 | 合計数 |
+--------+-----------+-------------+
| クラス1 | 41 | 235 |
| クラス2 | 43 | 235 |
| クラス3 | 57 | 235 |
| クラス4 | 57 | 235 |
| クラス5 | 37 | 235 |
+--------+-----------+-------------+
セット内の行数は 5 です (0.00 秒)

これをやる意味は何ですか?この方法で、各クラスの生徒の割合を一度に知ることができます。

mysql> *を選択、
 -> (stu_count)/(sum(stu_count) over()) をレートとして
 -> クラスから;
+--------+-----------+---------+
| 名前 | スタッカウント | レート |
+--------+-----------+---------+
| クラス1 | 41 | 0.1745 |
| クラス2 | 43 | 0.1830 |
| クラス3 | 57 | 0.2426 |
| クラス4 | 57 | 0.2426 |
| クラス5 | 37 | 0.1574 |
+--------+-----------+---------+
セット内の行数は 5 です (0.00 秒)

以前は、これは長くてわかりにくい段落を書くことによってのみ達成できました。ウィンドウ関数の詳細については、こちらをご覧ください。

いかがでしょうか?上記の紹介を読んで、MySQL 8.0 にさらに期待が持てるようになりましたか?

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL 8.0 の新機能 - チェック制約の紹介
  • MySQL 8.0の新機能、隠しフィールドの詳細な説明
  • MySQL 8.0 でのチェック制約の実装
  • MySQL 8.0 の新機能の分析 - トランザクション データ ディクショナリとアトミック DDL
  • MySQL 8.0 の新機能: ハッシュ結合
  • MySQL 8.0 の新機能の落とし穴と解決策についての簡単な説明 (要約)
  • MySQL 8.0 の新機能: アトミック DDL ステートメントのサポート
  • IDEA が MySQL ポート番号占有に接続できない問題の解決方法
  • MySQL を使用してポート 3306 を開いたり変更したり、Ubuntu/Linux 環境でアクセス許可を開く
  • phpstudy をインストールした後に MySQL を起動できない問題に対する完璧なソリューション (元のデータベースを削除する必要はなく、設定を変更する必要もなく、ポートを変更する必要もありません) 直接共存
  • LinuxでMySQLのリモートアクセス権を有効にし、ファイアウォールでポート3306を開きます。
  • MySQL 8.0 の新機能 - 管理ポートの使用の概要

<<:  Vueはタブを切り替えてデータの状態を維持する3つの方法を実装します

>>:  Ansibleを使用してディレクトリ内のすべてのコンテンツを削除する方法

推薦する

ウェブサイトの速度を上げる6つの方法

1. .js ライブラリ ファイルのアドレスを Google CDN アドレスに置き換えます。 (G...

ネイティブ JavaScript でショッピングカートを実装する

この記事では、ショッピングカートを実装するためのJavaScriptの具体的なコードを参考までに紹介...

ドロップダウンメニュー効果を実現するJavaScript

参考までに、JavaScriptを使用してドロップダウンメニューを実装します。具体的な内容は次のとお...

CSS3 で虫眼鏡効果を模倣するいくつかの方法の原理の分析

記事のタイトルが「模造虫眼鏡」なのはなぜですか?今日お話ししたいのは、一般的に言われているような、マ...

史上最もクリエイティブな404ページのデザインは、ウェブサイトのユーザーエクスペリエンスを効果的に向上させます

ウェブを閲覧しているときに 404 ページに遭遇することはあまりないので、見落としがちです。しかし、...

HTML の表の行と列を結合する問題の解決策の詳細な説明

私たちが構築しようとしていたウェブサイトには、長い文章だけでなく、多数の表も含まれており、表のレイア...

MySQL における tinyint と int の違いの詳細な説明

質問: int(1) と tinyint(1) の違いは何ですか?このような設計では、いずれにしても...

Docker Swarm を使用して分散クローラー クラスターを構築する例

クローラーの開発プロセス中に、クローラーを複数のサーバーに展開する必要がある状況に遭遇したことがある...

MySQL の悲観的ロックと楽観的ロックの理解と応用分析

この記事では、例を使用して MySQL の悲観的ロックと楽観的ロックについて説明します。ご参考までに...

MySQL バイナリログデータ復旧: 誤ってデータベースを削除した場合の詳細な説明

MySQL Binログデータの回復: 誤ってデータベースを削除した場合前書き: テスト マシンで誤っ...

Vueは3段階のナビゲーション表示と非表示を実装します

この記事では、3階層ナビゲーションの表示と非表示を実現するためのVueの具体的なコードを例として紹介...

Vueは左上と右上のスライドナビゲーションを実装します

ナビゲーションなどは日々の開発でよく使うので、記録として記事を書きます。ナビゲーションは終了/開始位...

Mysqlサーバーのインストール、構成、起動、シャットダウン方法の詳細な説明

1. 公式サイトからダウンロード: https://dev.mysql.com/downloads/...

Linux でのファイルの編集、保存、終了の実践的な説明

Linux でファイルを編集した後、保存して終了するにはどうすればよいですか?保存して終了するコマン...

Nginx の負荷分散アルゴリズムとフェイルオーバー分析

概要Nginx ロード バランシングは、アップストリーム サーバー (実際のビジネス ロジックによっ...