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を使用してディレクトリ内のすべてのコンテンツを削除する方法

推薦する

Vue 3 カスタムディレクティブ開発の概要

指令とは何ですか? Angular と Vue はどちらもディレクティブの概念を持っており、これは通...

MySQL ルート パスワードをリセットするときに発生する「不明な列 'password'」問題を解決する方法

夜にMACの電源を入れたところ、突然ルートアカウントがMySQLに正常にログインできなくなったため、...

Robots.txtの詳細な紹介

Robots.txt はプレーンテキスト ファイルであり、Web サイト管理者は、ロボットによるアク...

webpack-dev-server のコア概念とケースの詳細な説明

webpack-dev-server コアコンセプトWebpack の ContentBase と ...

MySQLのダウンロードとインストールのプロセスの詳細な説明

1: MySqlをダウンロードする公式サイトのダウンロードアドレス: https://dev.mys...

Nginxを使ってサーバー内で複数コンテナの共存を実現する方法

背景Tencent Linux クラウド ホストがあり、その上に Docker (ServiceDo...

uniapp エントリーレベル nvue クライミングピット記録の分析

目次序文こんにちは世界画像 境界線の半径を設定する実ピクセルを設定する外部CSSをインポートttfフ...

歴史的な Linux 画像処理および修復ソリューション

従来の Linux イメージで作成された ECS クラウド サーバーには、NTP と YUM が設定...

MySQL はどのようにしてデータベースの削除と暴走を効果的に防ぐことができますか?

目次セーフモード設定テスト1. where句なしで更新および削除する2. 非インデックスキーの削除3...

WeChatアプレット+EChartsで動的更新プロセス記録を実現

序文最近、小さなプログラムでリアルタイムにチャートを更新するという要件に遭遇しました。最初は wx-...

JSは円形のプログレスバーのドラッグとスライドを実装します

この記事の例では、円形のプログレスバーのドラッグアンドスライドを実現するための具体的なJSコードを紹...

html2canvasで画像が正常にキャプチャできない時の解決方法

質問まず、私が遭遇した問題についてお話しします。まず、そういった需要があるわけです。フロントエンドは...

Ubuntu 18.0.4 は mysql をインストールし、エラー 1698 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されましたを解決します

序文最近 Linux を学び、その後 Win から Ubuntu に変更しました。以前インストールし...

ページキャッシュを無効にするいくつかの方法を共有する

本日、開発中に、顧客からページをキャッシュしないように要求される方法に遭遇しました。調べたところ、ペ...

MySQL テーブル作成外部キー エラーの解決方法

データベーステーブルA: テーブル task_desc_tab を作成します ( id INT(11...