このページは機械翻訳したものです。
このセクションでは、MySQL 8.0 で追加された機能、非推奨になった機能、および削除された機能について要約しています。 コンパニオンセクションには、MySQL 8.0 で追加、非推奨または削除された MySQL サーバーのオプションおよび変数がリストされます。セクション1.4「MySQL 8.0 で追加、非推奨または削除されたサーバーおよびステータスの変数とオプション」 を参照してください。
次の機能が、MySQL 8.0 に追加されました。
- 
データディクショナリ. MySQL には、データベースオブジェクトに関する情報を格納するトランザクションデータディクショナリが組み込まれています。 以前の MySQL リリースでは、ディクショナリデータはメタデータファイルおよび非トランザクションテーブルに格納されていました。 詳細は、第14章「MySQL データディクショナリ」を参照してください。 
- 
アトミックデータ定義ステートメント (アトミック DDL). アトミック DDL ステートメントは、DDL 操作に関連付けられたデータディクショナリ更新、ストレージエンジン操作およびバイナリログ書込みを組み合せて、単一のアトミックトランザクションにします。 詳細は、セクション13.1.1「アトミックデータ定義ステートメントのサポート」を参照してください。 
- 
アップグレード手順. 以前は、新しいバージョンの MySQL をインストールした後、次回の起動時に MySQL サーバーは自動的にデータディクショナリテーブルをアップグレードしていましたが、その後、DBA が手動で mysql_upgrade を起動して、 mysqlスキーマ内のシステムテーブルおよびsysスキーマやユーザースキーマなどの他のスキーマ内のオブジェクトをアップグレードする必要がありました。MySQL 8.0.16 では、サーバーは以前 mysql_upgrade によって処理されていたタスクを実行します。 新しい MySQL バージョンのインストール後、サーバーは次回の起動時に必要なすべてのアップグレードタスクを自動的に実行するようになり、DBA が mysql_upgrade を呼び出す必要はなくなりました。 また、サーバーはヘルプテーブルの内容を更新します (mysql_upgrade では更新されませんでした)。 新しい --upgradeサーバーオプションは、サーバーがデータディクショナリおよびサーバーの自動アップグレード操作を実行する方法を制御します。 詳細は、セクション2.11.3「MySQL のアップグレードプロセスの内容」を参照してください。
- 
セキュリティとアカウント管理. セキュリティを向上させ、アカウント管理における DBA の柔軟性を高めるために、次の拡張機能が追加されました: - mysqlシステムデータベース内の付与テーブルが- InnoDB(トランザクション) テーブルになりました。 以前は、これらは- MyISAM(非トランザクション) テーブルでした。 付与テーブルのストレージエンジン変更により、アカウント管理ステートメントの動作が変わります。 以前は、複数のユーザーを指定したアカウント管理ステートメント (- CREATE USERや- DROP USERなど) は、一部のユーザーに対して成功し他のユーザーに対して失敗することがありました。 現在は、各ステートメントはトランザクションに対応し、指定されたすべてのユーザーに対して成功するか、エラーが発生した場合はロールバックされて何の影響も与えなくなりました。 ステートメントが成功した場合はバイナリログに書き込まれますが、失敗した場合は書き込まれず、ロールバックが発生して変更は行われません。 詳細は、セクション13.1.1「アトミックデータ定義ステートメントのサポート」を参照してください。
- 
新しい caching_sha2_password認証プラグインが使用可能です。sha256_passwordプラグインと同様に、caching_sha2_passwordは SHA-256 パスワードハッシングを実装しますが、接続時の待機時間の問題に対処するためにキャッシュを使用します。 ほかにも多くのトランスポートプロトコルをサポートしており、RSA キーペアベースのパスワード交換機能のために OpenSSL とのリンクを必要としません。 セクション6.4.1.2「SHA-2 プラガブル認証のキャッシュ」を参照してください。caching_sha2_passwordおよびsha256_password認証プラグインは、mysql_native_passwordプラグインよりもセキュアなパスワード暗号化を提供し、caching_sha2_passwordはsha256_passwordよりも優れたパフォーマンスを提供します。caching_sha2_passwordのこれらの優れたセキュリティおよびパフォーマンス特性のため、現在は優先認証プラグインであり、mysql_native_passwordではなくデフォルトの認証プラグインでもあります。 サーバー操作のためのデフォルトのプラグインのこの変更による影響、およびサーバーとクライアントおよびコネクタとの互換性については、優先認証プラグインとしての caching_sha2_password を参照してください。
- MySQL では、権限の名前付きコレクションであるロールがサポートされるようになりました。 ロールは作成および削除できます。 ロールには、付与された権限およびロールから取り消された権限を付与できます。 ロールは、ユーザーアカウントに対して付与または取り消すことができます。 アカウントに適用可能なアクティブなロールは、アカウントに付与されているロールの中から選択でき、そのアカウントのセッション中に変更できます。 詳細は、セクション6.2.10「ロールの使用」を参照してください。 
- MySQL には、ユーザーアカウントカテゴリの概念が組み込まれ、システムユーザーと通常のユーザーは - SYSTEM_USER権限を持っているかどうかによって区別されるようになりました。 セクション6.2.11「アカウントカテゴリ」を参照してください。
- 以前は、特定のスキーマを除き、グローバルに適用される権限を付与できませんでした。 これは、 - partial_revokesシステム変数が有効な場合に可能になりました。 セクション6.2.12「部分取消しを使用した権限の制限」を参照してください。
- GRANTステートメントには、ステートメントの実行に使用する権限コンテキストに関する追加情報を指定する- AS句があります。 この構文は SQL レベルで表示できますが、主な目的は、部分的な取消しによって課される権限付与者権限制限のすべてのノード間で均一なレプリケーションを有効にすることです。これにより、これらの制限がバイナリログに表示されます。 セクション13.7.1.6「GRANT ステートメント」を参照してください。- user[WITH ROLE]
- 
MySQL では、パスワード履歴に関する情報が保持されるようになり、以前のパスワードの再利用に関する制限が有効になりました。 DBA は、一定の変更回数または一定期間にわたって、以前使ったパスワードの再指定ができないように制限することができます。 アカウント単位およびグローバルにパスワード再利用ポリシーを設定することができます。 アカウントのパスワードを変更する場合、現在のパスワードの入力を要求することができるようになりました。 これにより、DBA は、現在のパスワードを知らないユーザーがパスワードを変更するのを阻止できます。 パスワード検証ポリシーは、グローバルにもアカウントごとにも設定できます。 アカウントはデュアルパスワードを持つことができるようになりました。これにより、停止時間なしで複雑な複数サーバーシステムで段階的なパスワード変更をシームレスに実行できます。 MySQL では、管理者がユーザーアカウントを構成できるようになり、パスワードの誤りによる連続したログイン失敗が多すぎると一時アカウントがロックされるようになりました。 必要な失敗数とロック時間は、アカウントごとに構成できます。 これらの新機能により、DBA はパスワード管理をより完全に制御できます。 詳細は、セクション6.2.15「パスワード管理」を参照してください。 
- OpenSSL を使用してコンパイルされた場合、MySQL で FIPS モードがサポートされるようになり、OpenSSL ライブラリおよび FIPS オブジェクトモジュールを実行時に使用できるようになりました。 FIPS モードでは、許容される暗号化アルゴリズムの制限や長いキー長の要件などの暗号化操作に条件が適用されます。 セクション6.8「FIPS のサポート」を参照してください。 
- サーバーが新しい接続に使用する TLS コンテキストは、実行時に再構成可能になりました。 この機能は、SSL 証明書が期限切れになるまで実行されている MySQL サーバーを再起動しないようにする場合などに役立ちます。 サーバー側のランタイム構成および暗号化された接続の監視を参照してください。 
- OpenSSL 1.1.1 では、暗号化された接続用に TLS v1.3 プロトコルがサポートされ、MySQL 8.0.16 以上では、サーバーとクライアントの両方が OpenSSL 1.1.1 以上を使用してコンパイルされている場合に TLS v1.3 もサポートされます。 セクション6.3.2「暗号化された接続 TLS プロトコルおよび暗号」を参照してください。 
- MySQL は、名前付きパイプ上のクライアントに付与されるアクセス制御を、Windows での正常な通信に必要な最小値に設定するようになりました。 新しい MySQL クライアントソフトウェアは、追加構成なしで名前付きパイプ接続を開くことができます。 古いクライアントソフトウェアをすぐにアップグレードできない場合は、新しい - named_pipe_full_access_groupシステム変数を使用して、名前付きパイプ接続を開くために必要な権限を Windows グループに付与できます。 フルアクセスグループのメンバーシップは制限され、一時的である必要があります。
 
- 
リソース管理. MySQL では、リソースグループの作成および管理がサポートされるようになり、グループで使用可能なリソースに従ってスレッドが実行されるように、サーバー内で実行されているスレッドを特定のグループに割り当てることができます。 グループ属性を使用すると、そのリソースを制御して、グループ内のスレッドによるリソース消費を有効にしたり制限したりすることができます。 DBA は、様々なワークロードに応じてこれらの属性を変更できます。 >現在、CPU 時間は管理可能なリソースであり、CPU コア、ハイパースレッド、ハードウェアスレッドなどを含む用語として「「仮想 CPU」」の概念で表現されています。 サーバーは起動時に使用可能な仮想 CPU の数を決定し、適切な権限を持つデータベース管理者はこれらの CPU をリソースグループに関連付け、スレッドをグループに割り当てることができます。 詳細は、セクション5.1.16「リソースグループ」を参照してください。 
- 
テーブルの暗号化管理. 暗号化のデフォルトを定義して強制することで、テーブルの暗号化をグローバルに管理できるようになりました。 default_table_encryption変数は、新しく作成されたスキーマおよび一般テーブルスペースの暗号化デフォルトを定義します。 スキーマの暗号化のデフォルトは、スキーマの作成時にDEFAULT ENCRYPTION句を使用して定義することもできます。 デフォルトでは、テーブルは作成されたスキーマまたは一般テーブルスペースの暗号化を継承します。 暗号化のデフォルトは、table_encryption_privilege_check変数を有効にすることで適用されます。 権限チェックは、default_table_encryption設定とは異なる暗号化設定を使用してスキーマまたは一般テーブルスペースを作成または変更する場合、またはデフォルトのスキーマ暗号化とは異なる暗号化設定を使用してテーブルを作成または変更する場合に発生します。TABLE_ENCRYPTION_ADMIN権限では、table_encryption_privilege_checkが有効な場合にデフォルトの暗号化設定をオーバーライドできます。 詳細は、スキーマおよび一般テーブルスペースの暗号化デフォルトの定義を参照してください。
- 
InnoDB の拡張機能. 次の InnoDBの拡張機能が追加されました。- 
現在の最大自動インクリメントカウンタ値は、値が変更されるたびに redo ログに書き込まれ、チェックポイントごとにエンジン固有のシステムテーブルに保存されます。 これらの変更により、現在の最大自動インクリメントカウンタ値がサーバーの再起動後も保持されます。 さらに、次のようになります: - サーバーを再起動しても、 - AUTO_INCREMENT = Nテーブルオプションの効果は取り消されなくなりました。 自動インクリメントカウンタを特定の値に初期化した場合、または自動インクリメントカウンタ値を大きな値に変更した場合、新しい値はサーバーの再起動後も保持されます。
- ROLLBACK操作の直後にサーバーを再起動しても、ロールバックされたトランザクションに割り当てられた自動増分値は再利用されなくなりました。
- AUTO_INCREMENTカラムの値を現在の最大自動増分値より大きい値 (- UPDATE操作など) に変更すると、新しい値が永続化され、後続の- INSERT操作では新しい大きい値から始まる自動増分値が割り当てられます。
 詳細は、セクション15.6.1.6「InnoDB での AUTO_INCREMENT 処理」およびInnoDB AUTO_INCREMENT カウンタの初期化を参照してください。 
- インデックスツリーの破損が発生すると、 - InnoDBは破損フラグを redo ログに書き込み、破損フラグを安全にクラッシュさせます。 また、- InnoDBは、インメモリー破損フラグデータを各チェックポイントのエンジン専用システムテーブルに書き込みます。 リカバリ中、- InnoDBは、インメモリーテーブルおよびインデックスオブジェクトを破損としてマークする前に、両方の場所から破損フラグを読み取り、結果をマージします。
- InnoDBmemcached プラグインは、複数の- get操作 (単一の memcached クエリーで複数のキーと値のペアをフェッチ) および範囲クエリーをサポートしています。 セクション15.20.4「InnoDB memcached の複数の get および Range クエリーのサポート」を参照してください。
- 
デッドロック検出を無効にするには、新しい動的変数 innodb_deadlock_detectを使用できます。 同時実行性の高いシステムでは、多数のスレッドが同じロックを待機している場合、デッドロック検出によって速度が低下する可能性があります。 デッドロック検出を無効にし、デッドロック発生時のトランザクションロールバックのinnodb_lock_wait_timeout設定に依存する方が効率的な場合があります。
- 新しい - INFORMATION_SCHEMA.INNODB_CACHED_INDEXESテーブルには、インデックスごとに- InnoDBバッファプールにキャッシュされたインデックスページの数がレポートされます。
- InnoDB一時テーブルが共有一時テーブルスペースである- ibtmp1に作成されます。
- InnoDBtablespace encryption feature では、redo ログおよび undo ログデータの暗号化がサポートされています。 redo ログの暗号化およびundo ログの暗号化を参照してください。
- 
InnoDBは、SELECT ... FOR SHAREおよびSELECT ... FOR UPDATEのロック読取りステートメントでNOWAITおよびSKIP LOCKEDオプションをサポートしています。NOWAITでは、リクエストされた行が別のトランザクションによってロックされている場合、ステートメントはただちに戻されます。SKIP LOCKEDでは、ロックされた行が結果セットから削除されます。 NOWAIT および SKIP LOCKED による読取り同時実行性のロックを参照してください。SELECT ... FOR SHAREはSELECT ... LOCK IN SHARE MODEに置き換わりますが、LOCK IN SHARE MODEは下位互換性のために引き続き使用できます。 ステートメントは同等です。 ただし、FOR UPDATEおよびFOR SHAREはNOWAIT、SKIP LOCKEDおよびOFオプションをサポートしています。 セクション13.2.10「SELECT ステートメント」を参照してください。tbl_nameOFでは、名前付きテーブルにロッククエリーが適用されます。tbl_name
- 
ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REORGANIZE PARTITIONおよびREBUILD PARTITIONALTER TABLEオプションは、ネイティブパーティション化インプレース API でサポートされており、ALGORITHM={COPY|INPLACE}およびLOCK句とともに使用できます。ALGORITHM=INPLACEを使用したDROP PARTITIONは、パーティションに格納されているデータを削除し、パーティションを削除します。 ただし、ALGORITHM=COPYまたはold_alter_table=ONを使用したDROP PARTITIONでは、パーティションテーブルが再構築され、削除されたパーティションから互換性のあるPARTITION ... VALUES定義を持つ別のパーティションへのデータの移動が試行されます。 別のパーティションに移動できないデータは削除されます。
- InnoDBストレージエンジンは、独自のストレージエンジン固有のデータディクショナリではなく、MySQL データディクショナリを使用するようになりました。 データディクショナリの詳細は、第14章「MySQL データディクショナリ」 を参照してください。
- mysqlシステムテーブルおよびデータディクショナリテーブルは、MySQL データディレクトリの- mysql.ibdという名前の単一の- InnoDBテーブルスペースファイルに作成されるようになりました。 以前は、これらのテーブルは- mysqlデータベースディレクトリ内の個々の- InnoDBテーブルスペースファイルに作成されていました。
- 
MySQL 8.0 では、次の undo テーブルスペースの変更が導入されています: - デフォルトでは、undo ログは、MySQL インスタンスの初期化時に作成される 2 つの undo テーブルスペースに存在するようになりました。 undo ログはシステムテーブルスペースに作成されなくなりました。 
- 
MySQL 8.0.14 では、 CREATE UNDO TABLESPACE構文を使用して、実行時に選択した場所に追加の undo テーブルスペースを作成できます。CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';CREATE UNDO TABLESPACE構文を使用して作成された undo テーブルスペースは、DROP UNDO TABLESPACE構文を使用して実行時に削除できます。DROP UNDO TABLESPACE tablespace_name;ALTER UNDO TABLESPACE構文を使用すると、undo テーブルスペースをアクティブまたは非アクティブとしてマークできます。ALTER UNDO TABLESPACE tablespace_name SET {ACTIVE|INACTIVE};テーブルスペースの状態を示す STATEカラムがINFORMATION_SCHEMA.INNODB_TABLESPACESテーブルに追加されました。 undo テーブルスペースは、削除する前にempty状態である必要があります。
- innodb_undo_log_truncate変数はデフォルトで有効になっています。
- innodb_rollback_segments変数は、undo テーブルスペースごとのロールバックセグメントの数を定義します。 以前は、- innodb_rollback_segmentsは MySQL インスタンスのロールバックセグメントの合計数を指定していました。 この変更により、同時トランザクションに使用可能なロールバックセグメントの数が増加します。 ロールバックセグメントを増やすと、同時トランザクションが undo ログに個別のロールバックセグメントを使用する可能性が高くなり、リソースの競合が少なくなります。
 
- 
バッファープールの事前フラッシュおよびフラッシュの動作に影響を与える変数のデフォルト値が変更されました: - innodb_max_dirty_pages_pct_lwmのデフォルト値は 10 になりました。 前のデフォルト値の 0 は、バッファープールの事前フラッシュを無効にします。 値 10 を指定すると、バッファープール内のダーティーページの割合が 10% を超える場合に事前フラッシュが有効になります。 事前フラッシュを有効にすると、パフォーマンスの一貫性が向上します。
- innodb_max_dirty_pages_pctのデフォルト値が 75 から 90 に増加しました。- InnoDBは、ダーティページの割合がこの値を超えないように、バッファプールからデータをフラッシュしようとします。 デフォルト値を大きくすると、バッファープール内のダーティーページの割合が高くなります。
 
- 
デフォルトの innodb_autoinc_lock_mode設定は 2 (インターリーブ) になりました。 インターリーブロックモードでは、複数行の挿入をパラレルに実行できるため、同時実行性とスケーラビリティが向上します。 新しいinnodb_autoinc_lock_modeのデフォルト設定は、MySQL 5.7 のデフォルトのレプリケーションタイプがステートメントベースレプリケーションから行ベースレプリケーションに変更されたことを反映しています。 ステートメントベースのレプリケーションでは、SQL ステートメントの実行順序に合わせて自動増分値が正しい順序で割り当てられるように、連続した自動増分ロックモード (前のデフォルト) が必要ですが、行ベースのレプリケーションでは SQL ステートメントの実行順序に影響しません。 詳細は、InnoDB AUTO_INCREMENT のロックモードを参照してください。ステートメントベースレプリケーションを使用するシステムでは、新しい innodb_autoinc_lock_modeのデフォルト設定によって、シーケンシャルな自動インクリメント値に依存するアプリケーションが壊れる可能性があります。 以前のデフォルトに戻すには、innodb_autoinc_lock_modeを 1 に設定します。
- 一般的なテーブルスペースの名前変更は、 - ALTER TABLESPACE ... RENAME TO構文でサポートされています。
- 
デフォルトで無効になっている新しい innodb_dedicated_server変数を使用すると、サーバーで検出されたメモリー量に応じてInnoDBで次のオプションを自動的に構成できます:- innodb_buffer_pool_size
- innodb_log_file_size
- innodb_flush_method
 このオプションは、専用サーバーで実行する MySQL サーバーインスタンスを対象としています。 詳細は、セクション15.8.12「専用 MySQL Server の自動構成の有効化」を参照してください。 
- 新しい - INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEFビューでは、- InnoDBテーブルスペースの領域、名前、パス、フラグおよび領域タイプのデータが提供されます。
- 
MySQL にバンドルされている「zlib ライブラリ」バージョンは、バージョン 1.2.3 からバージョン 1.2.11 に引き上げられました。 MySQL は zlib ライブラリを使用して圧縮を実装します。 InnoDB圧縮テーブルを使用する場合、関連するアップグレードの影響については、セクション2.11.4「MySQL 8.0 での変更」 を参照してください。
- 
シリアライズされたディクショナリ情報 (SDI) は、グローバル一時テーブルスペースおよび undo テーブルスペースファイルを除くすべての InnoDBテーブルスペースファイルに存在します。 SDI は、テーブルおよびテーブルスペースオブジェクトのシリアライズされたメタデータです。 SDI データが存在すると、メタデータの冗長性が提供されます。 たとえば、データディクショナリが使用できなくなった場合、ディクショナリオブジェクトメタデータをテーブルスペースファイルから抽出できます。 SDI 抽出は、ibd2sdi ツールを使用して実行されます。 SDI データはJSON形式で格納されます。SDI データをテーブルスペースファイルに含めると、テーブルスペースのファイルサイズが増加します。 SDI レコードには、デフォルトで 16KB の単一のインデックスページが必要です。 ただし、SDI データは格納時に圧縮され、ストレージフットプリントが削減されます。 
- InnoDBストレージエンジンはアトミック DDL をサポートするようになり、操作中にサーバーが停止した場合でも、DDL 操作が完全にコミットまたはロールバックされるようになりました。 詳細は、セクション13.1.1「アトミックデータ定義ステートメントのサポート」を参照してください。
- innodb_directoriesオプションを使用すると、サーバーがオフラインのときに、テーブルスペースファイルを新しい場所に移動またはリストアできます。 詳細は、セクション15.6.3.6「サーバーがオフラインのときのテーブルスペースファイルの移動」を参照してください。
- 
次の redo ロギング最適化が実装されました: - ユーザースレッドは、書込みを同期せずにログバッファに同時に書き込むことができるようになりました。 
- ユーザースレッドは、ダーティページを緩やかな順序でフラッシュリストに追加できるようになりました。 
- 専用ログスレッドは、システムバッファへのログバッファの書込み、ディスクへのシステムバッファのフラッシュ、書込みおよびフラッシュされた redo についてのユーザースレッドへの通知、緩和されたフラッシュリストの順序に必要なラグの維持およびチェックポイントの書込みを担当するようになりました。 
- 
フラッシュされた redo を待機しているユーザースレッドによるスピン遅延の使用を構成するためのシステム変数が追加されました: - innodb_log_wait_for_flush_spin_hwm: フラッシュされた redo の待機中にユーザースレッドがスピンしなくなる最大平均ログフラッシュ時間を定義します。
- innodb_log_spin_cpu_abs_lwm: フラッシュされた redo の待機中にユーザースレッドがスピンしなくなる CPU 使用率の最小量を定義します。
- innodb_log_spin_cpu_pct_hwm: フラッシュされた redo の待機中にユーザースレッドがスピンしなくなる CPU 使用率の最大量を定義します。
 
- innodb_log_buffer_size変数が動的になり、サーバーの実行中にログバッファのサイズ変更が可能になりました。
 詳細は、セクション8.5.4「InnoDB redo ロギングの最適化」を参照してください。 
- MySQL 8.0.12 では、ラージオブジェクト (LOB) データに対する小さい更新で undo ロギングがサポートされているため、サイズが 100 バイト以下の LOB 更新のパフォーマンスが向上します。 以前は、LOB の更新は少なくとも 1 つの LOB ページのサイズでしたが、数バイトしか変更できない更新には最適ではありませんでした。 この拡張機能は、LOB データの部分更新のために MySQL 8.0.4 で追加されたサポートに基づいています。 
- 
MySQL 8.0.12 では、 ALGORITHM=INSTANTは次のALTER TABLE操作でサポートされています:- カラムの追加。 この機能は、「「インスタント - ADD COLUMN」」とも呼ばれます。 制限が適用されます。 セクション15.12.1「オンライン DDL 操作」を参照してください。
- 仮想カラムの追加または削除。 
- カラムのデフォルト値の追加または削除。 
- ENUMまたは- SETカラムの定義の変更。
- インデックスタイプの変更。 
- テーブルの名前の変更。 
 ALGORITHM=INSTANTをサポートする操作では、データディクショナリのメタデータのみが変更されます。 テーブルに対するメタデータロックは行われず、テーブルデータは影響を受けず、操作は即時に行われます。 明示的に指定しない場合、ALGORITHM=INSTANTはそれをサポートする操作によってデフォルトで使用されます。ALGORITHM=INSTANTが指定されているがサポートされていない場合、操作はエラーですぐに失敗します。ALGORITHM=INSTANTをサポートする操作の詳細は、セクション15.12.1「オンライン DDL 操作」 を参照してください。
- MySQL 8.0.13 の時点で、 - TempTableストレージエンジンはバイナリラージオブジェクト (BLOB) 型のカラムの格納をサポートしています。 この拡張により、BLOB データを含む一時テーブルを使用するクエリーのパフォーマンスが向上します。 以前は、BLOB データを含む一時テーブルは、- internal_tmp_disk_storage_engineによって定義されたディスク上のストレージエンジンに格納されていました。 詳細は、セクション8.4.4「MySQL での内部一時テーブルの使用」を参照してください。
- 
MySQL 8.0.13 では、 InnoDBの保存データ暗号化機能は一般的なテーブルスペースをサポートしています。 以前は、file-per-table テーブルスペースのみを暗号化できました。 一般テーブルスペースの暗号化をサポートするために、CREATE TABLESPACEおよびALTER TABLESPACE構文が拡張され、ENCRYPTION句が追加されました。INFORMATION_SCHEMA.INNODB_TABLESPACESテーブルに、テーブルスペースが暗号化されているかどうかを示すENCRYPTIONカラムが含まれるようになりました。一般的なテーブルスペース暗号化操作の監視を許可するために、 stage/innodb/alter tablespace (encryption)パフォーマンススキーマステージインストゥルメントが追加されました。
- innodb_buffer_pool_in_core_file変数を無効にすると、- InnoDBバッファープールページが除外され、コアファイルのサイズが小さくなります。 この変数を使用するには、- core_file変数を有効にし、オペレーティングシステムで- madvise()に対する- MADV_DONTDUMPの POSIX 以外の拡張機能をサポートする必要があります。これは Linux 3.4 以降でサポートされています。 詳細は、セクション15.8.3.7「コアファイルからのバッファープールページの除外」を参照してください。
- 
MySQL 8.0.13 では、オプティマイザによって作成されたユーザー作成の一時テーブルおよび内部一時テーブルは、一時テーブルスペースのプールからセッションに割り当てられたセッション一時テーブルスペースに格納されます。 セッションが切断されると、その一時テーブルスペースは切り捨てられ、プールに解放されます。 以前のリリースでは、一時テーブルはグローバル一時テーブルスペース ( ibtmp1) に作成されており、一時テーブルの削除後にディスク領域がオペレーティングシステムに戻されませんでした。innodb_temp_tablespaces_dir変数は、セッション一時テーブルスペースが作成される場所を定義します。 デフォルトの場所は、データディレクトリ内の#innodb_tempディレクトリです。INNODB_SESSION_TEMP_TABLESPACESテーブルは、セッション一時テーブルスペースに関するメタデータを提供します。グローバル一時テーブルスペース ( ibtmp1) には、ユーザーが作成した一時テーブルに対する変更のロールバックセグメントが格納されるようになりました。
- MySQL 8.0.14 では、 - InnoDBはクラスタ化されたパラレルインデックス読取りをサポートしているため、- CHECK TABLEのパフォーマンスを向上させることができます。 この機能は、セカンダリインデックススキャンには適用されません。 パラレルクラスタインデックス読取りを実行するには、- innodb_parallel_read_threadsセッション変数を 1 より大きい値に設定する必要があります。 デフォルト値は 4 です。 パラレルクラスタインデックス読取りの実行に使用されるスレッドの実際の数は、- innodb_parallel_read_threads設定またはスキャンするインデックスサブツリーの数 (いずれか小さい方) によって決まります。
- 8.0.14 では、 - innodb_dedicated_server変数が有効な場合、ログファイルのサイズと数は、自動的に構成されたバッファプールサイズに従って構成されます。 以前は、サーバーで検出されたメモリー量に従ってログファイルサイズが構成されており、ログファイルの数は自動的には構成されませんでした。
- 8.0.14 では、 - CREATE TABLESPACEステートメントの- ADD DATAFILE句はオプションで、- FILE権限のないユーザーがテーブルスペースを作成できます。- ADD DATAFILE句を指定せずに- CREATE TABLESPACEステートメントを実行すると、一意のファイル名でテーブルスペースデータファイルが暗黙的に作成されます。
- デフォルトでは、TempTable ストレージエンジンが占有しているメモリー量が - temptable_max_ram変数で定義されているメモリー制限を超えると、TempTable ストレージエンジンはメモリーマップされた一時ファイルのディスクからの割り当てを開始します。 MySQL 8.0.16 では、この動作は- temptable_use_mmap変数によって制御されます。- temptable_use_mmapを無効にすると、TempTable ストレージエンジンは、オーバーフローメカニズムとしてメモリーマップされたファイルの代わりに- InnoDBディスク上の内部一時テーブルを使用します。 詳細は、内部一時テーブルストレージエンジンを参照してください。
- MySQL 8.0.16 では、 - InnoDBの保存データ暗号化機能は- mysqlシステムテーブルスペースの暗号化をサポートしています。- mysqlシステムテーブルスペースには、- mysqlシステムデータベースおよび MySQL データディクショナリテーブルが含まれます。 詳細は、セクション15.13「InnoDB 保存データ暗号化」を参照してください。
- MySQL 8.0.16 で導入された - innodb_spin_wait_pause_multiplier変数を使用すると、スレッドが mutex または rw-lock の取得を待機したときに発生するスピンロックポーリング遅延の期間をより詳細に制御できます。 遅延は、プロセッサアーキテクチャーごとに PAUSE 命令の期間の違いを考慮して、より細かくチューニングできます。 詳細は、セクション15.8.8「スピンロックのポーリングの構成」を参照してください。
- 
大規模なデータセットの InnoDBのパラレル読取りスレッドパフォーマンスは、読取りスレッドの使用率の向上、パラレルスキャン中に発生するプリフェッチアクティビティのための読取りスレッド I/O の削減、およびパーティションのパラレルスキャンのサポートにより、MySQL 8.0.17 で向上しました。パラレル読取りスレッド機能は、 innodb_parallel_read_threads変数によって制御されます。 最大設定は 256 になりました。これは、すべてのクライアント接続のスレッドの合計数です。 スレッド制限に達すると、接続は単一スレッドの使用にフォールバックします。
- MySQL 8.0.18 で導入された - innodb_idle_flush_pct変数を使用すると、アイドル期間中のページフラッシュに制限を設定できるため、ソリッドステートストレージデバイスの存続期間を延長できます。 アイドル期間中のバッファフラッシュの制限を参照してください。
- ヒストグラム統計を生成するための - InnoDBデータの効率的なサンプリングは、MySQL 8.0.19 の時点でサポートされています。 ヒストグラム統計分析を参照してください。
- 
MySQL 8.0.20 の時点では、二重書込みバッファ記憶域は二重書込みファイルにあります。 以前のリリースでは、記憶域はシステムテーブルスペースに存在していました。 システムテーブルスペースから記憶域を移動すると、書込み待機時間が短縮され、スループットが向上し、二重書込みバッファページの配置に関して柔軟性が提供されます。 拡張二重書込みバッファ構成には、次のシステム変数が導入されました: - 
innodb_doublewrite_dir二重書込みバッファファイルディレクトリを定義します。 
- 
innodb_doublewrite_files二重書込みファイルの数を定義します。 
- 
innodb_doublewrite_pagesバッチ書込みのスレッド当たりの二重書込みページの最大数を定義します。 
- 
innodb_doublewrite_batch_sizeバッチで書き込む二重書込みページの数を定義します。 
 詳細は、セクション15.6.4「二重書き込みバッファー」を参照してください。 
- 
- 
ロックを待機しているトランザクションに優先順位を付ける競合対応トランザクションスケジューリング (CATS) アルゴリズムは、MySQL 8.0.20 で改善されました。 トランザクションスケジュールの重み計算が完全に個別のスレッドで実行されるようになり、計算のパフォーマンスと精度が向上しました。 トランザクションのスケジューリングにも使用されていた先入れ先出し (FIFO) アルゴリズムが削除されました。 FIFO アルゴリズムは CATS アルゴリズムの改善によって不要になりました。 FIFO アルゴリズムによって以前に実行されたトランザクションスケジューリングが CATS アルゴリズムによって実行されるようになりました。 INFORMATION_SCHEMA.INNODB_TRXテーブルにTRX_SCHEDULE_WEIGHTカラムが追加され、CATS アルゴリズムによって割り当てられたトランザクションスケジューリングの重みの問い合わせが可能になりました。コードレベルのトランザクションスケジューリングイベントを監視するために、次の INNODB_METRICSカウンタが追加されました:- 
lock_rec_release_attemptsレコードロックの解放の試行回数。 
- 
lock_rec_grant_attemptsレコードロックの付与を試行する回数。 
- 
lock_schedule_refreshesトランザクションスケジュールの重みを更新するために待機グラフが分析された回数。 
 詳細は、セクション15.7.6「トランザクションスケジューリング」を参照してください。 
- 
- 
MySQL 8.0.21 の時点では、テーブルおよび行リソースのロックキューへのアクセスを必要とする操作の同時実行性を向上させるために、ロックシステム mutex ( lock_sys->mutex) がシャードラッチに置き換えられ、ロックキューがテーブルおよびページキューシャードのロックにグループ化され、各シャードが専用 mutex で保護されました。 以前は、シングルロックシステム mutex はすべてのロックキューを保護していました。これは、同時実行性の高いシステムでの競合のポイントでした。 新しいシャード実装では、ロックキューへのより詳細なアクセスが許可されます。ロックシステム mutex ( lock_sys->mutex) は、次のシャードラッチに置き換えられました:- 64 個の読取り/書込みロックオブジェクト ( - rw_lock_t) で構成されるグローバルラッチ (- lock_sys->latches.global_latch)。 個々のロックキューにアクセスするには、共有グローバルラッチとロックキューシャードのラッチが必要です。 すべてのロックキューへのアクセスを必要とする操作では、排他的なグローバルラッチが使用され、すべてのテーブルおよびページロックキューのシャードがラッチされます。
- 512 の mutex の配列として実装されるテーブルシャードラッチ ( - lock_sys->latches.table_shards.mutexes)。各 mutex は 512 のテーブルロックキューシャードのいずれか専用です。
- 512 個の mutex の配列として実装されるページシャードラッチ ( - lock_sys->latches.page_shards.mutexes)。各 mutex は 512 個のページロックキューシャードのいずれか専用です。
 単一ロックシステム相互排他ロックをモニタリングするためのパフォーマンススキーマ wait/synch/mutex/innodb/lock_mutexインストゥルメントは、新しいグローバルシャード、テーブルシャード、およびページシャードラッチをモニタリングするためのインストゥルメントに置き換えられました:- wait/synch/sxlock/innodb/lock_sys_global_rw_lock
- wait/synch/mutex/innodb/lock_sys_table_mutex
- wait/synch/mutex/innodb/lock_sys_page_mutex
 
- 
MySQL 8.0.21 では、 DATA DIRECTORY句を使用してデータディレクトリの外部で作成されたテーブルおよびテーブルパーティションのデータファイルは、InnoDBで認識されているディレクトリに制限されます。 この変更により、データベース管理者はテーブルスペースデータファイルが作成される場所を制御でき、リカバリ中にデータファイルが検出されるようになります。一般テーブルスペースおよびファイルごとのテーブルスペースのデータファイル ( .ibdファイル) は、InnoDBで直接認識されないかぎり、undo テーブルスペースディレクトリ (innodb_undo_directory) に作成できなくなりました。既知のディレクトリは、 datadir、innodb_data_home_dirおよびinnodb_directories変数で定義されているディレクトリです。file-per-table テーブルスペースに存在する InnoDBテーブルを切り捨てると、既存のテーブルスペースが削除され、新しいテーブルスペースが作成されます。 MySQL 8.0.21 では、InnoDBはデフォルトの場所に新しいテーブルスペースを作成し、現在のテーブルスペースディレクトリが不明な場合はエラーログに警告を書き込みます。TRUNCATE TABLEで現在の場所にテーブルスペースを作成するには、TRUNCATE TABLEを実行する前にinnodb_directories設定にディレクトリを追加します。
- 
MySQL 8.0.21 では、 ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG構文を使用して redo ロギングを有効化および無効化できます。 この機能は、新しい MySQL インスタンスにデータをロードするためのものです。 redo ロギングを無効にすると、redo ログの書込みが回避され、データのロードが高速化されます。新しい INNODB_REDO_LOG_ENABLE権限では、redo ロギングの有効化および無効化が許可されます。新しい Innodb_redo_log_enabledステータス変数を使用すると、redo ロギングステータスを監視できます。redo ロギングの無効化を参照してください。 
- 
起動時に、 InnoDBは、テーブルスペースファイルが別の場所に移動された場合に備えて、データディクショナリに格納されているテーブルスペースファイルパスに対して既知のテーブルスペースファイルのパスを検証します。 MySQL 8.0.21 で導入された新しいinnodb_validate_tablespace_paths変数を使用すると、テーブルスペースパス検証を無効にできます。 この機能は、テーブルスペースファイルを移動しない環境を対象としています。 テーブルスペースパス検証を無効にすると、多数のテーブルスペースファイルがあるシステムでの起動時間が短縮されます。詳細は、セクション15.6.3.7「テーブルスペースパス検証の無効化」を参照してください。 
- MySQL 8.0.21 の時点では、アトミック DDL をサポートするストレージエンジンでは、行ベースレプリケーションが使用されているときに、 - CREATE TABLE ... SELECTステートメントがバイナリログに 1 つのトランザクションとして記録されます。 以前は、2 つのトランザクションとしてログに記録されていました。1 つはテーブルの作成用、もう 1 つはデータの挿入用です。 この変更により、- CREATE TABLE ... SELECTステートメントは行ベースレプリケーションに対して安全になり、GTID ベースレプリケーションでの使用が許可されるようになりました。 詳細は、セクション13.1.1「アトミックデータ定義ステートメントのサポート」を参照してください。
- 
ビジー状態のシステムで undo テーブルスペースを切り捨てると、バッファプールから古い undo テーブルスペースページを削除し、新しい undo テーブルスペースの初期ページをディスクにフラッシュするフラッシュ操作が関連付けられているため、パフォーマンスに影響する可能性があります。 この問題に対処するために、MySQL 8.0.21 でフラッシュ操作が削除されました。 古い undo テーブルスペースページは、最近最も使用されなくなるか、次の完全チェックポイントで削除されると、パッシブに解放されます。 新しい undo テーブルスペースの初期ページは、切捨て操作中にディスクにフラッシュされるのではなく redo ログに記録されるようになりました。これにより、undo テーブルスペースの切捨て操作の永続性も向上します。 undo テーブルスペースの切捨て操作の数が多すぎることが原因で発生する潜在的な問題を回避するために、チェックポイント間の同じ undo テーブルスペースに対する切捨て操作は 64 に制限されるようになりました。 この制限を超えると、undo テーブルスペースは非アクティブにできますが、次のチェックポイントまで切り捨てられません。 廃止された undo 切捨てフラッシュ操作に関連付けられた INNODB_METRICSカウンタが削除されました。 削除されたカウンタには次が含まれます:undo_truncate_sweep_count,undo_truncate_sweep_usec,undo_truncate_flush_countおよびundo_truncate_flush_usec。セクション15.6.3.4「undo テーブルスペース」を参照してください。 
- 
MySQL 8.0.22 の時点では、新しい innodb_extend_and_initialize変数を使用して、InnoDBが Linux 上の file-per-table および一般的なテーブルスペースに領域を割り当てる方法を構成できます。 デフォルトでは、操作にテーブルスペースの追加領域が必要な場合、InnoDBはそのテーブルスペースにページを割り当て、それらのページに NULL を物理的に書き込みます。 この動作は、新しいページが頻繁に割り当てられる場合のパフォーマンスに影響します。 Linux システムでinnodb_extend_and_initializeを無効にして、新しく割り当てられたテーブルスペースページへの NULL の物理的な書込みを回避できます。innodb_extend_and_initializeが無効になっている場合、領域はposix_fallocate()コールを使用して割り当てられます。このコールは、物理的に NULL を書き込まずに領域を予約します。posix_fallocate()操作はアトミックではないため、テーブルスペースファイルへの領域の割当てとファイルメタデータの更新の間に障害が発生する可能性があります。 このような障害が発生すると、新しく割り当てられたページは初期化されていない状態のままになり、InnoDBがこれらのページにアクセスしようとしたときに障害が発生する可能性があります。 このシナリオを回避するために、InnoDBは新しいテーブルスペースページを割り当てる前に redo ログレコードを書き込みます。 ページ割当て操作が中断されると、リカバリ中に redo ログレコードから操作がリプレイされます。
- MySQL 8.0.23 では、 - InnoDBは暗号化されたテーブルスペースに属する二重書込みファイルページの暗号化をサポートしています。 ページは、関連付けられたテーブルスペースの暗号化キーを使用して暗号化されます。 詳細は、セクション15.13「InnoDB 保存データ暗号化」を参照してください。
- MySQL 8.0.23 で導入された - temptable_max_mmap変数は、TempTable ストレージエンジンが内部一時テーブルデータのディスクへの格納を開始する前に、メモリーマップ (MMAP) ファイルから割り当てることができるメモリーの最大量を定義します。 0 に設定すると、MMAP ファイルからの割り当てが無効になります。 詳細は、セクション8.4.4「MySQL での内部一時テーブルの使用」を参照してください。
- 
MySQL 8.0.23 で導入された AUTOEXTEND_SIZEオプションは、テーブルスペースが一杯になったときにInnoDBがテーブルスペースのサイズを拡張する量を定義し、テーブルスペースのサイズを大きく拡張できるようにします。AUTOEXTEND_SIZEオプションは、CREATE TABLE,ALTER TABLE,CREATE TABLESPACEおよびALTER TABLESPACEステートメントでサポートされています。 詳細は、セクション15.6.3.9「テーブルスペースの AUTOEXTEND_SIZE 構成」を参照してください。AUTOEXTEND_SIZEサイズカラムがINFORMATION_SCHEMA.INNODB_TABLESPACESテーブルに追加されました。
 
- 
- 
文字セットのサポート. デフォルトの文字セットが latin1からutf8mb4に変更されました。utf8mb4文字セットには、MySQL の Unicode で使用可能な最初の日本語固有の照合であるutf8mb4_ja_0900_as_csを含む、いくつかの新しい照合順序があります。 詳細は、セクション10.10.1「Unicode 文字セット」を参照してください。
- 
JSON の拡張機能. MySQL JSON 機能が次のように拡張または追加されました: - 
JSON_EXTRACT()の結果でJSON_UNQUOTE()をコールするのと同等の->>(インラインパス) 演算子が追加されました。これは、MySQL 5.7 で導入されたカラムパス演算子 ->の改良です。col->>"$.path"はJSON_UNQUOTE(col->"$.path")と同等です。 インラインパス演算子は、SELECTカラムリスト、WHERE句とHAVING句、ORDER BY句とGROUP BY句など、JSON_UNQUOTE(JSON_EXTRACT())を使用できる任意の場所で使用できます。 詳細は、演算子の説明および JSON パス構文 を参照してください。
- 2 つの JSON 集計関数 - JSON_ARRAYAGG()および- JSON_OBJECTAGG()が追加されました。- JSON_ARRAYAGG()は、引数としてカラムまたは式を取り、結果を単一の- JSON配カラムとして集計します。 式は任意の MySQL データ型に評価できます。これは- JSON値である必要はありません。- JSON_OBJECTAGG()では、キーおよび値として解釈される 2 つのカラムまたは式が使用され、結果は単一の- JSONオブジェクトとして返されます。 詳細および例については、セクション12.20「集計関数」を参照してください。
- 
既存の JSON値を読みやすい形式で出力する JSON ユーティリティ関数JSON_PRETTY()が追加されました。各 JSON オブジェクトメンバーまたは配列値は別々の行に出力され、子オブジェクトまたは配列はその親に対して 2 文字のスペースでインデントされます。この関数は、JSON 値として解析できる文字列でも機能します。 詳細および例については、セクション12.18.8「JSON ユーティリティ関数」を参照してください。 
- 
ORDER BYを使用してクエリーでJSON値をソートする場合、各値は固定サイズの 1K の一部ではなく、ソートキーの可変長部分で表されるようになりました。 多くの場合、これにより過剰な使用量が削減される可能性があります。 たとえば、スカラーINTまたはBIGINT値には、実際には非常に少ないバイト数が必要であるため、この領域の残り (最大 90% 以上) はパディングによって占有されています。 この変更には、パフォーマンスに関して次の利点があります:- ソートバッファー領域がより効率的に使用されるようになったため、ファイルソートは固定長のソートキーを使用する場合と同じくらい早くディスクにフラッシュする必要はありません。 つまり、メモリー内でソートできるデータが増え、不要なディスクアクセスが回避されます。 
- 短いキーは長いキーよりも迅速に比較できるため、パフォーマンスが著しく向上します。 これは、メモリー内で完全に実行されるソートと、ディスクへの書込みおよびディスクからの読取りが必要なソートに当てはまります。 
 
- 
JSONカラム値の部分的なインプレース更新のサポートが MySQL 8.0.2 に追加されました。これは、JSONカラムの更新時に以前に行ったように、既存の JSON 値を完全に削除してその場所に新しい JSON 値を書き込むよりも効率的です。 この最適化を適用するには、JSON_SET()、JSON_REPLACE()またはJSON_REMOVE()を使用して更新を適用する必要があります。 更新中の JSON ドキュメントに新しい要素を追加することはできません。ドキュメント内の値は、更新前よりも多くの領域を取ることはできません。 要件の詳細は、JSON 値の部分更新 を参照してください。JSON ドキュメントの部分更新はバイナリログに書き込むことができ、完全な JSON ドキュメントをロギングするよりも少ない領域を占有します。 ステートメントベースのレプリケーションが使用されている場合、部分更新は常にそのように記録されます。 これを行ベースのレプリケーションで使用するには、まず binlog_row_value_options=PARTIAL_JSONを設定する必要があります。詳細は、この変数の説明を参照してください。
- 
JSON ユーティリティ関数 JSON_STORAGE_SIZE()およびJSON_STORAGE_FREE()が追加されました。JSON_STORAGE_SIZE()は、部分更新の前に JSON ドキュメントのバイナリ表現に使用される記憶領域をバイト単位で返します (前の項目を参照)。JSON_STORAGE_FREE()では、JSON_SET()またはJSON_REPLACE()を使用して部分的に更新された後、JSON型のテーブルのカラムに残っている領域の量が表示されます。新しい値のバイナリ表現が前の値より小さい場合、これはゼロより大きくなります。これらの各関数は、JSON ドキュメントの有効な文字列表現も受け入れます。 このような値の場合、 JSON_STORAGE_SIZE()は JSON ドキュメントへの変換後にバイナリ表現で使用される領域を返します。 JSON ドキュメントの文字列表現を含む変数の場合、JSON_STORAGE_FREE()はゼロを返します。 いずれの関数も、その (null 以外の) 引数を有効な JSON ドキュメントとして解析できない場合はエラーを生成し、引数がNULLの場合はNULLを生成します。詳細および例については、セクション12.18.8「JSON ユーティリティ関数」を参照してください。 JSON_STORAGE_SIZE()およびJSON_STORAGE_FREE()は、MySQL 8.0.2 に実装されました。
- MySQL 8.0.2 では、XPath 式で - $[1 to 5]などの範囲をサポートするようになりました。 また、このバージョンでの- lastキーワードと相対アドレス指定のサポートが追加され、- $[last]は常に配列の最後 (最も高い番号) の要素を選択し、- $[last-1]は最後の 1 つ前の要素を選択するようになりました。- lastおよびそれを使用する式は、範囲定義に含めることもできます。 たとえば、- $[last-2 to last-1]は、配列の最後を除いた手前 2 つの要素を返します。 追加情報および例については、JSON 値の検索および変更を参照してください。
- 
RFC 7396 に準拠するための JSON マージ関数が追加されました。 JSON_MERGE_PATCH()は、2 つの JSON オブジェクトで使用される場合、次のセットの結合をメンバーとして持つ単一の JSON オブジェクトにマージします:- 2 番目のオブジェクトに同じキーを持つメンバがない最初のオブジェクトの各メンバ。 
- 最初のオブジェクトに同じキーを持つメンバーが存在せず、その値が JSON - nullリテラルではない、2 番目のオブジェクトの各メンバー。
- 両方のオブジェクトに存在し、2 番目のオブジェクトの値が JSON - nullリテラルではないキーを持つ各メンバー。
 この作業の一環として、 JSON_MERGE()関数の名前はJSON_MERGE_PRESERVE()に変更されました。JSON_MERGE()は、MySQL 8.0 でJSON_MERGE_PRESERVE()のエイリアスとして引き続き認識されますが、非推奨になり、MySQL の将来のバージョンで削除される予定です。詳細および例については、セクション12.18.4「JSON 値を変更する関数」を参照してください。 
- 
RFC 7159 およびほとんどの JavaScript パーサーと同様の、重複キーの「「最後の重複キー優先」」正規化を実装しました。 この動作の例を次に示します。ここでは、キー xを持つ右端のメンバーのみが保持されます:mysql> SELECT JSON_OBJECT('x', '32', 'y', '[true, false]', > 'x', '"abc"', 'x', '100') AS Result; +------------------------------------+ | Result | +------------------------------------+ | {"x": "100", "y": "[true, false]"} | +------------------------------------+ 1 row in set (0.00 sec)次の例に示すように、MySQL JSONカラムに挿入された値もこの方法で正規化されます:mysql> CREATE TABLE t1 (c1 JSON); mysql> INSERT INTO t1 VALUES ('{"x": 17, "x": "red", "x": [3, 5, 7]}'); mysql> SELECT c1 FROM t1; +------------------+ | c1 | +------------------+ | {"x": [3, 5, 7]} | +------------------+これは、このような場合に「「最初の重複キー優先」」アルゴリズムが使用されていた以前のバージョンの MySQL とは互換性のない変更です。 詳細および例については、JSON 値の正規化、マージおよび自動ラップを参照してください。 
- 
MySQL 8.0.4 に JSON_TABLE()関数が追加されました。 この関数は、JSON データを受け入れ、指定されたカラムを持つリレーショナルテーブルとして戻します。この関数の構文は、 JSON_TABLE(です。ここで、expr,pathCOLUMNScolumn_list) [AS]alias)exprは JSON データを返す式、pathはソースに適用される JSON パス、column_listはカラム定義のリストです。 次に例を示します:mysql> SELECT * -> FROM -> JSON_TABLE( -> '[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]', -> "$[*]" COLUMNS( -> rowid FOR ORDINALITY, -> -> xa INT EXISTS PATH "$.a", -> xb INT EXISTS PATH "$.b", -> -> sa VARCHAR(100) PATH "$.a", -> sb VARCHAR(100) PATH "$.b", -> -> ja JSON PATH "$.a", -> jb JSON PATH "$.b" -> ) -> ) AS jt1; +-------+------+------+------+------+------+--------+ | rowid | xa | xb | sa | sb | ja | jb | +-------+------+------+------+------+------+--------+ | 1 | 1 | 1 | 3 | 0 | 3 | "0" | | 2 | 1 | 1 | 3 | 1 | "3" | "1" | | 3 | 1 | 1 | 2 | 1 | 2 | 1 | | 4 | 1 | 0 | 0 | NULL | 0 | NULL | | 5 | 0 | 1 | NULL | NULL | NULL | [1, 2] | +-------+------+------+------+------+------+--------+JSON ソース式には、JSON リテラル、テーブルのカラム、 JSON_EXTRACT(t1, data, '$.post.comments')などの JSON を返す関数コールなど、有効な JSON ドキュメントを生成する任意の式を指定できます。 詳細は、セクション12.18.6「JSON テーブル関数」を参照してください。
 
- 
- 
データ型のサポート. MySQL では、データ型指定でのデフォルト値としての式の使用がサポートされるようになりました。 これには、以前はデフォルト値を割り当てることができなかった BLOB,TEXT,GEOMETRYおよびJSONデータ型のデフォルト値としての式の使用が含まれます。 詳細は、セクション11.6「データ型デフォルト値」を参照してください。
- 
オプティマイザ. 次のオプティマイザ拡張機能が追加されました: - MySQL で不可視インデックスがサポートされるようになりました。 不可視のインデックスはオプティマイザではまったく使用されませんが、それ以外の場合は正常にメンテナンスされます。 インデックスはデフォルトで可視化されます。 不可視のインデックスを使用すると、インデックスが必要になった場合に元に戻す必要がある破壊的な変更を行わずに、クエリーのパフォーマンスに対するインデックスの削除の影響をテストできます。 セクション8.3.12「不可視のインデックス」を参照してください。 
- MySQL で降順インデックスがサポートされるようになりました: インデックス定義内の - DESCは無視されなくなりましたが、キー値が降順で格納されます。 以前は、インデックスを逆の順序でスキャンできましたが、パフォーマンスが低下していました。 降順インデックスは順にスキャンできるため、より効率的です。 降順インデックスを使用すると、オプティマイザが複数カラムインデックスを使用できるようになります (最も効率的なスキャン順序で一部のカラムに昇順が混在し、他のカラムに降順が混在している場合)。 セクション8.3.13「降順インデックス」を参照してください。
- MySQL では、カラム値ではなく式の値をインデックス付けする関数インデックスキー部分の作成がサポートされるようになりました。 関数キーパーツを使用すると、 - JSON値など、インデックス化できない値のインデックス化が可能です。 詳細は、セクション13.1.15「CREATE INDEX ステートメント」を参照してください。
- 
MySQL 8.0.14 以降では、定数リテラル式から発生する自明の WHERE条件は、後で最適化するのではなく、準備中に削除されます。 このプロセスの前半で条件を削除すると、次のような簡易条件を持つ外部結合を含むクエリーの結合を簡略化できます:SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1オプティマイザは、準備中に 0 = 1 が常に false であることを確認し、 OR 0 = 1を冗長にして削除し、次の状態のままにします:SELECT * FROM t1 LEFT JOIN t2 ON condition_1 where condition_2これで、オプティマイザは、次のようにクエリーを内部結合としてリライトできます: SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1 AND condition_2詳細は、セクション8.2.1.9「外部結合の最適化」を参照してください。 
- 
MySQL 8.0.16 以降では、MySQL は最適化時に定数折りたたみを使用して、実行時に行ごとに行うのではなく、カラムと定数値 (定数がカラムの範囲外またはカラムのタイプに対する範囲境界) の比較を処理できます。 たとえば、 TINYINT UNSIGNEDカラムcを含むテーブルtの場合、オプティマイザはWHERE c < 256などの条件をWHERE 1にリライト (および条件を完全に最適化) したり、WHERE c >= 255をWHERE c = 255にリライトできます。詳しくはセクション8.2.1.14「定数 - フォールディングの最適化」,をご覧ください。 
- 
MySQL 8.0.16 以降、 INサブクエリーで使用される準結合最適化をEXISTSサブクエリーにも適用できるようになりました。 また、オプティマイザでは、サブクエリーにアタッチされたWHERE条件のわずかな相関等価述語が解除され、INサブクエリーの式と同様に処理できるようになりました。これは、EXISTSサブクエリーとINサブクエリーの両方に適用されます。詳細は、セクション8.2.2.1「準結合変換による IN および EXISTS サブクエリー述語の最適化」を参照してください。 
- 
MySQL 8.0.17 では、サーバーはコンテキスト化フェーズ中に不完全な SQL 述語 (つまり、 valueがカラム名または定数式で、比較演算子が使用されていないWHERE形式の述語) をvalueWHEREとして内部的にリライトするため、クエリーリゾルバ、クエリーオプティマイザおよびクエリーエグゼキュータは完全な述語のみ処理すればよくなりました。value<> 0この変更の表示可能な効果の 1 つは、ブール値の場合、 EXPLAIN出力に1および0ではなくtrueおよびfalseが表示されるようになったことです。この変更によるもう 1 つの効果は、SQL ブールコンテキストで JSON 値を評価すると、JSON 整数 0 に対して暗黙の比較が行われることです。 次のように作成および移入されたテーブルについて考えてみます: mysql> CREATE TABLE test (id INT, col JSON); mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}');以前は、 IS TRUEを使用した次のクエリーに示すように、サーバーは、抽出されたtrueまたはfalseの値を SQL ブールコンテキストで比較するときに SQL ブールに変換しようとしました:mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE; +------+---------------+--------------+ | id | col | col->"$.val" | +------+---------------+--------------+ | 1 | {"val": true} | true | +------+---------------+--------------+MySQL 8.0.17 以降では、抽出された値を JSON 整数 0 と暗黙の照合により、異なる結果をもたらします: mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE; +------+----------------+--------------+ | id | col | col->"$.val" | +------+----------------+--------------+ | 1 | {"val": true} | true | | 2 | {"val": false} | false | +------+----------------+--------------+MySQL 8.0.21 以降では、次に示すように、抽出された値に対して JSON_VALUE()を使用して、テストを実行する前に型変換を実行できます:mysql> SELECT id, col, col->"$.val" FROM test -> WHERE JSON_VALUE(col, "$.val" RETURNING UNSIGNED) IS TRUE; +------+---------------+--------------+ | id | col | col->"$.val" | +------+---------------+--------------+ | 1 | {"val": true} | true | +------+---------------+--------------+また、MySQL 8.0.21 以降では、この方法で SQL ブールコンテキストの抽出された値を比較する際に、サーバーによって警告「Evaluating a JSON value in SQL boolean context does an implicit comparison against JSON integer 0; if this is not what you want, consider converting JSON to an SQL numeric type with JSON_VALUE RETURNING when comparing extracted values in an SQL boolean context in this manner. (SQL ブールコンテキストで JSON 値を評価すると、JSON の整数 0 との暗黙の比較が行われます。想定と違う場合は、JSON_VALUE RETURNING を使用して JSON を SQL 数値型に変換することを検討してください)」が提供されます。 
- 
MySQL 8.0.17 以降では、 NOT IN (またはsubquery)NOT EXISTS (を含むsubquery)WHERE条件は内部的にアンチ結合に変換されます。 (アンチ結合は、結合先のテーブルにある、結合条件に一致する行以外のすべての行を返します。) サブクエリーのテーブルが最優先で処理されるようになったことで、遅いサブクエリーが削除されて結果的に問い合わせの実行が速くなります。これは、外部結合用の既存の IS NULL(Not exists) 最適化に似ており、それを再利用したものです。EXPLAIN 追加情報 を参照してください。
- 
MySQL 8.0.21 以降、多くの場合、単一テーブルの UPDATEステートメントまたはDELETEステートメントで準結合変換またはサブクエリーの実体化を使用できるようになりました。 これは、次に示す形式のステートメントに適用されます:- UPDATE t1 SET t1.a=- valueWHERE t1.a IN (SELECT t2.a FROM t2)
- DELETE FROM t1 WHERE t1.a IN (SELECT t2.a FROM t2)
 これは、次の条件を満たす単一テーブルの UPDATEまたはDELETEに対して実行できます:- UPDATEステートメントまたは- DELETEステートメントでは、- [NOT] IN述語または- [NOT] EXISTS述語を持つサブクエリーが使用されます。
- 
ステートメントには ORDER BY句がなく、LIMIT句もありません。( UPDATEおよびDELETEの複数テーブルバージョンでは、ORDER BYまたはLIMITはサポートされていません。)
- ターゲットテーブルでは、読取り/書込み削除はサポートされていません ( - NDBテーブルにのみ関連します)。
- 準結合またはサブクエリーの実体化は、サブクエリーに含まれるヒントおよび - optimizer_switchの値に基づいて実行できます。
 準結合最適化が適格な単一テーブル DELETEまたはUPDATEに使用されている場合、これはオプティマイザトレースに表示されます: 複数テーブルのステートメントの場合はトレースにjoin_optimizationオブジェクトがありますが、単一テーブルのステートメントの場合はありません。 変換は、EXPLAIN FORMAT=TREEまたはEXPLAIN ANALYZEの出力にも表示されます。単一テーブルのステートメントは<not executable by iterator executor>を示し、複数テーブルのステートメントは完全な計画をレポートします。MySQL 8.0.21 以降では、 REPEATABLE READより弱いトランザクション分離レベルのために、InnoDBテーブルを使用する複数テーブルのUPDATEステートメントで半一貫性読取りがサポートされます。
- 
ハッシュ結合パフォーマンスの向上. MySQL 8.0.23 はハッシュ結合に使用されるハッシュテーブルを再実装するため、ハッシュ結合のパフォーマンスがいくつか向上します。 この作業には問題 (Bug #31516149、Bug #99933) の修正が含まれており、結合バッファ ( join_buffer_size) に割り当てられたメモリーの約 2/3 のみをハッシュ結合で実際に使用できます。通常、新しいハッシュテーブルは古いハッシュテーブルより高速で、位置合せ、キー/値、および同等のキーが多数あるシナリオで使用されるメモリーが少なくなります。 また、ハッシュテーブルのサイズが増えると、サーバーは古いメモリーを解放できるようになりました。 
 
- 
共通テーブル式. MySQL では、非再帰テーブルと再帰テーブルの両方の共通テーブル式がサポートされるようになりました。 共通テーブル式を使用すると、名前付き一時結果セットを使用できます。この結果セットは、 SELECTステートメントおよびその他の特定のステートメントの前にWITH句を記述する形で実装されます。 詳細は、セクション13.2.15「WITH (共通テーブル式)」を参照してください。MySQL 8.0.19 では、再帰的共通テーブル式 (CTE) の再帰的 SELECT部分でLIMIT句がサポートされています。LIMITとOFFSETもサポートされています。 詳しくは再帰的な共通テーブル式,をご覧ください。
- 
ウィンドウ関数. MySQL では、クエリーの各行について、その行に関連する行を使用して計算を実行するウィンドウ関数がサポートされるようになりました。 これには、 RANK()、LAG()、NTILE()などの関数が含まれます。 また、複数の既存の集計関数をウィンドウ関数 (SUM()やAVG()など) として使用できるようになりました。 詳細は、セクション12.21「ウィンドウ関数」を参照してください。
- 
ラテラル導出テーブル. 導出テーブルの前に LATERALキーワードを付けて、同じFROM句内の前述のテーブルのカラムを参照 (依存) できるように指定できるようになりました。 ラテラル導出テーブルを使用すると、非ラテラル導出テーブルでは実行できない特定の SQL 操作や、より効率的な回避策が必要になる可能性があります。 セクション13.2.11.9「ラテラル導出テーブル」を参照してください。
- 
単一テーブル DELETE ステートメントのエイリアス. MySQL 8.0.16 以降では、単一テーブルの DELETEステートメントでテーブルのエイリアスの使用がサポートされます。
- 
正規表現のサポート. 以前は、MySQL は Henry Spencer 正規表現ライブラリを使用して正規表現演算子 ( REGEXP、RLIKE) をサポートしていました。 完全な Unicode サポートを提供し、マルチバイトセーフな International Components for Unicode (ICU) を使用して、正規表現のサポートが再実装されました。REGEXP_LIKE()関数は、REGEXP演算子およびRLIKE演算子 (現在はその関数のシノニム) の方法で正規表現の一致を実行します。 また、REGEXP_INSTR()、REGEXP_REPLACE()およびREGEXP_SUBSTR()の各関数を使用して、一致する位置を検索し、部分文字列の置換および抽出をそれぞれ実行できます。regexp_stack_limitおよびregexp_time_limitシステム変数は、照合エンジンによるリソース消費を制御します。 詳細については、セクション12.8.2「正規表現」を参照してください。 正規表現を使用するアプリケーションが実装の変更の影響を受ける方法の詳細は、正規表現の互換性に関する考慮事項 を参照してください。
- 
内部一時テーブル. TempTableストレージエンジンは、インメモリー内部一時テーブルのデフォルトエンジンとしてMEMORYストレージエンジンを置き換えます。TempTableストレージエンジンは、VARCHARおよびVARBINARYカラムの効率的なストレージを提供します。internal_tmp_mem_storage_engineセッション変数は、インメモリー内部一時テーブルのストレージエンジンを定義します。 許可される値は、TempTable(デフォルト) およびMEMORYです。temptable_max_ram変数は、データがディスクに格納される前にTempTableストレージエンジンが使用できるメモリーの最大量を定義します。
- 
ロギング. エラーロギングは、MySQL コンポーネントアーキテクチャを使用するようにリライトされました。 従来のエラーロギングは組込みコンポーネントを使用して実装され、システムログを使用したロギングはロード可能コンポーネントとして実装されます。 また、ロード可能な JSON ログライターも使用できます。 有効にするログコンポーネントを制御するには、 log_error_servicesシステム変数を使用します。 詳細は、セクション5.4.2「エラーログ」を参照してください。
- 
バックアップロック. 新しいタイプのバックアップロックでは、オンラインバックアップ中に DML が許可されますが、一貫性のないスナップショットになる可能性がある操作は防止されます。 新しいバックアップロックは、 LOCK INSTANCE FOR BACKUPおよびUNLOCK INSTANCE構文でサポートされています。 これらのステートメントを使用するには、BACKUP_ADMIN権限が必要です。
- 
レプリケーション. MySQL レプリケーションが次のように拡張されました: - MySQL レプリケーションでは、コンパクトなバイナリ形式を使用した JSON ドキュメントへの部分的な更新のバイナリロギングをサポートし、完全な JSON ドキュメントを記録するよりもログの領域を節約できるようになりました。 このようなコンパクトロギングは、ステートメントベースのロギングが使用されているときに自動的に実行され、新しい - binlog_row_value_optionsシステム変数を- PARTIAL_JSONに設定することで有効にできます。 詳細は、JSON 値の部分更新 および- binlog_row_value_optionsの説明を参照してください。
 
- 
接続管理. MySQL Server では、管理接続専用に TCP/IP ポートを構成できるようになりました。 これは、通常接続用のネットワークインターフェースで許可されていた追加の管理用接続 ( max_connectionsの接続がすでに確立されている場合でも 1 つだけ追加で管理接続が可能) の代替となります。 セクション5.1.12.1「接続インタフェース」を参照してください。MySQL では、サーバーへの接続を介して送信されるバイト数を最小限に抑えるために、圧縮の使用をより詳細に制御できるようになりました。 以前は、特定の接続が zlib圧縮アルゴリズムを圧縮解除または使用していました。zstdアルゴリズムを使用して、zstd接続の圧縮レベルを選択することもできます。 許可される圧縮アルゴリズムは、サーバー側でも接続元 (クライアントプログラムおよび、ソース/レプリカレプリケーションやグループレプリケーションに参加しているサーバー) の側でも設定することができます。 詳細は、セクション4.2.8「接続圧縮制御」を参照してください。
- 
構成. MySQL 全体で許可されているホスト名の最大長は、以前の 60 文字の制限から 255 文字まで ASCII 文字になりました。 これは、データディクショナリ内のホスト名関連のカラム、 mysqlシステムスキーマ、パフォーマンススキーマ、INFORMATION_SCHEMAおよびsysスキーマ、MASTER_HOST値 (CHANGE MASTER TO属性用)、Hostカラム (SHOW PROCESSLISTステートメントの出力内)、アカウント名内のホスト名 (account-management ステートメントおよびDEFINER属性内で使用など)、およびホスト名関連のシステム変数に適用されます。注意事項: - 許可されるホスト名の長さを増やすと、ホスト名カラムにインデックスがあるテーブルに影響する可能性があります。 たとえば、ホスト名をインデックス付けする - mysqlシステムスキーマのテーブルには、長いインデックス値を格納するために- DYNAMICの明示的な- ROW_FORMAT属性が含まれるようになりました。
- ファイル名を値として持つ構成設定の中には、サーバーのホスト名に基づいて構築されるものがあります。 許容される値は、255 文字のホスト名を含むような長いファイル名を許可していないケースのように、基礎となるオペレーティングシステムによって制約されます。 これは、 - general_log_file,- log_error,- pid_file,- relay_log、- slow_query_log_fileシステム変数および対応するオプションに影響します。 ホスト名に基づく値が OS に対して長すぎる場合は、明示的に短い値を指定する必要があります。
- サーバーで 255 文字のホスト名がサポートされるようになりましたが、 - --ssl-mode=VERIFY_IDENTITYオプションを使用して確立されるサーバーへの接続は、OpenSSL でサポートされるホスト名の最大長によって制約されます。 ホスト名の一致は、SSL 証明書の 2 つのフィールドに関連し、最大長は次のとおりです: 共通名: 最大長 64;サブジェクト代替名: RFC#1034 に従った最大長。
 
- 
プラグイン. 以前は、MySQL プラグインは C または C++ で記述できました。 プラグインで使用される MySQL ヘッダーファイルに C++ コードが含まれるようになりました。つまり、プラグインは C ではなく C++ で記述する必要があります。 
- 
C API. MySQL C API では、MySQL サーバーとのノンブロック通信用の非同期関数がサポートされるようになりました。 各関数は、既存の同期関数に対応する非同期関数です。 同期関数は、サーバー接続からの読取りまたはサーバー接続への書込みを待機する必要がある場合にブロックします。 非同期関数を使用すると、アプリケーションはサーバー接続での作業を続行する準備ができているかどうかを確認できます。 そうでない場合、アプリケーションが他の作業を行った後で、再確認することができます。 C API Asynchronous Interfaceを参照してください。 
- 
キャストの追加のターゲットタイプ. CAST()およびCONVERT()の関数は、DOUBLE、FLOATおよびREAL型への変換をサポートするようになりました。 MySQL 8.0.17 で追加されました。 セクション12.11「キャスト関数と演算子」を参照してください。
- 
JSON スキーマ検証. MySQL 8.0.17 には、JSON ドキュメントを再度 JSON スキーマで検証するための JSON_SCHEMA_VALID()およびJSON_SCHEMA_VALIDATION_REPORT()の 2 つの関数が追加されています。JSON_SCHEMA_VALID()は、ドキュメントがスキーマに対して検証される場合は TRUE (1) を戻し、検証されない場合は FALSE (0) を戻します。JSON_SCHEMA_VALIDATION_REPORT()は、検証の結果に関する詳細情報を含む JSON ドキュメントを返します。 次のステートメントは、これらの両方の関数に適用されます:- スキーマは、JSON スキーマ仕様のドラフト 4 に準拠する必要があります。 
- required属性がサポートされています。
- 外部リソースおよび - $refキーワードはサポートされていません。
- 正規表現パターンがサポートされています。無効なパターンは暗黙的に無視されます。 
 詳細および例については、セクション12.18.7「JSON スキーマ検証関数」を参照してください。 
- 
複数値インデックス. MySQL 8.0.17 以降、 InnoDBでは複数値インデックスの作成がサポートされています。これは、値の配カラムを格納し、単一のデータレコードに対して複数のインデックスレコードを持つことができるJSONカラムに定義されたセカンダリインデックスです。 このようなインデックスでは、CAST(data->'$.zipcode' AS UNSIGNED ARRAY)などのキー部分定義が使用されます。 複数値インデックスは、EXPLAINの出力で表示できるように、適切なクエリーのために MySQL オプティマイザによって自動的に使用されます。この作業の一環として、MySQL では、 JSONドキュメントを操作するための新しい関数JSON_OVERLAPS()および新しいMEMBER OF()演算子が追加され、さらに次のリストで説明するように、CAST()関数が新しいARRAYキーワードで拡張されます:- JSON_OVERLAPS()では、2 つの- JSON文書が比較されます。 共通のキーと値のペアまたは配列要素が含まれている場合、この関数は TRUE (1) を返し、それ以外の場合は FALSE (0) を返します。 両方の値がスカラーの場合、関数は等価性の単純なテストを実行します。 一方の引数が JSON 配列で、もう一方がスカラーの場合、スカラーは配列要素として扱われます。 したがって、- JSON_OVERLAPS()は- JSON_CONTAINS()の補完として機能します。
- MEMBER OF()は、最初のオペランド (スカラーまたは JSON ドキュメント) が 2 番目のオペランドとして渡された JSON 配列のメンバーであるかどうかをテストし、メンバーである場合は TRUE (1)、そうでない場合は FALSE (0) を返します。 オペランドの型変換は実行されません。
- CAST(では、- expressionAS- typeARRAY)- json_pathの JSON ドキュメントにある JSON 配列を SQL 配列にキャストすることで、関数インデックスを作成できます。 型指定子は、- CAST()ですでにサポートされているものに限られます。ただし- BINARY(サポートされていません) を除きます。- CAST()(および- ARRAYキーワード) のこの使用方法は、- InnoDBでのみサポートされ、複数値インデックスの作成にのみ使用できます。
 例を含む複数値インデックスの詳細は、複数値インデックス を参照してください。セクション12.18.3「JSON 値を検索する関数」 では、 JSON_OVERLAPS()およびMEMBER OF()に関する情報を使用例とともに提供します。
- 
time_zone を使用したオプティマイザヒント. MySQL 8.0.17 では、 SET_VARによるオプティマイザヒントにtime_zoneセッション変数を使用可能です。
- 
redo ログのアーカイブ. MySQL 8.0.17 では、 InnoDBは redo ログのアーカイブをサポートしています。 redo ログレコードをコピーするバックアップユーティリティは、バックアップ操作の進行中に redo ログの生成に対応できない場合があり、その結果、それらのレコードが上書きされるために redo ログレコードが失われます。 redo ログアーカイブ機能は、redo ログレコードをアーカイブファイルに順次書き込むことで、この問題に対処します。 バックアップユーティリティでは、必要に応じてアーカイブファイルから redo ログレコードをコピーできるため、データが失われる可能性を回避できます。 詳細は、redo ログのアーカイブを参照してください。
- 
クローンプラグイン. MySQL 8.0.17 の時点で、MySQL は、 InnoDBデータをローカルまたはリモートの MySQL サーバーインスタンスからクローニングできるクローンプラグインを提供します。 ローカルクローニング操作では、MySQL インスタンスが実行されているのと同じサーバーまたはノードにクローンデータが格納されます。 リモートクローニング操作では、クローニング操作が開始されたドナー MySQL サーバーインスタンスから受信者サーバーまたはノードに、ネットワーク経由でクローンデータが転送されます。クローンプラグインはレプリケーションをサポートします。 クローニング操作では、クローニングデータに加えて、ドナーからレプリケーション座標が抽出および転送され、受信者に適用されるため、グループレプリケーションメンバーおよびレプリカのプロビジョニングにクローンプラグインを使用できます。 プロビジョニングにクローンプラグインを使用すると、多数のトランザクションをレプリケートするよりもはるかに高速かつ効率的になります。 グループレプリケーションメンバーは、シードメンバーからグループデータを取得する最も効率的な方法をメンバーが自動的に選択できるように、代替のリカバリ方法としてクローンプラグインを使用するように構成することもできます。 詳細は、セクション5.6.7「クローンプラグイン」およびセクション18.4.3.2「分散リカバリのためのクローニング」を参照してください。 
- 
ハッシュ結合の最適化. MySQL 8.0.18 以降、結合内のテーブルの各ペアに少なくとも 1 つの等価結合条件が含まれ、結合条件にはインデックスが適用されない場合は常にハッシュ結合が使用されます。 ハッシュ結合はインデックスを必要としませんが、単一テーブルの述語にのみ適用されるインデックスで使用できます。 ほとんどの場合、ハッシュ結合はブロックネストループアルゴリズムより効率的です。 ここに示すような結合は、次の方法で最適化できます: SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1; SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2) JOIN t3 ON (t2.c1 = t3.c1)ハッシュ結合は、デカルト積 (結合条件が指定されていない場合) にも使用できます。 EXPLAIN FORMAT=TREEまたはEXPLAIN ANALYZEを使用して、ハッシュ結合の最適化が特定のクエリーに使用されているかどうかを確認できます。 (MySQL 8.0.20 以降では、FORMAT=TREEを省略してEXPLAINを使用することもできます。)ハッシュ結合で使用可能なメモリー量は、 join_buffer_sizeの値によって制限されます。 この量を超えるメモリーを必要とするハッシュ結合がディスク上で実行されます。ディスク上のハッシュ結合で使用できるディスクファイルの数は、open_files_limitによって制限されます。MySQL 8.0.19 の時点では、MySQL 8.0.18 で導入された hash_joinオプティマイザスイッチはサポートされなくなりました (hash_join=on は optimizer_switch の値の一部として表示されますが、設定しても効果はなくなります)。HASH_JOINおよびNO_HASH_JOINオプティマイザヒントもサポートされなくなりました。 スイッチとヒントの両方が非推奨になりました。将来の MySQL リリースで削除される予定です。 MySQL 8.0.18 以降では、NO_BNLオプティマイザスイッチを使用してハッシュ結合を無効にできます。MySQL 8.0.20 以降では、ブロックのネステッドループは MySQL サーバーで使用されなくなり、クエリーに等価結合条件が含まれていない場合でも、ブロックのネステッドループが以前に使用された場合は常にハッシュ結合が使用されます。 これは、内部非等価結合、準結合、アンチ結合、左外部結合および右外部結合に適用されます。 optimizer_switchシステム変数、BNLおよびNO_BNLオプティマイザヒントに対するblock_nested_loopフラグは引き続きサポートされますが、以降はハッシュ結合の使用のみが制御されます。 また、内部結合と外部結合 (準結合とアンチ結合を含む) の両方でバッチキーアクセス (BKA) を使用できるようになりました。BKA では、結合バッファメモリーが増分的に割り当てられるため、個々のクエリーで実際には解決に必要のない大量のリソースを使用する必要はありません。 内部結合の BKA は、MySQL 8.0.18 以降でのみサポートされています。また、MySQL 8.0.20 は、以前のバージョンの MySQL で使用されていたエグゼキュータをイテレータエグゼキュータに置き換えます。 この作業には、準結合として最適化されていない INクエリーに対するWHERE形式のクエリーを制御する古いインデックスサブクエリーエンジンの置換、および以前は古いエグゼキュータに依存していた同じ形式で実体化されたクエリーが含まれます。valueIN (SELECTcolumnFROMtableWHERE ...)詳細および例については、セクション8.2.1.4「ハッシュ結合の最適化」を参照してください。 Batched Key Access 結合も参照してください。 
- 
EXPLAIN ANALYZE ステートメント. 新しい形式の EXPLAINステートメントEXPLAIN ANALYZEが MySQL 8.0.18 に実装され、クエリーの処理に使用されるイテレータごとにSELECTステートメントの実行に関する拡張情報がTREE形式で提供され、見積りコストをクエリーの実際のコストと比較できるようになりました。 この情報には、起動コスト、合計コスト、このイテレータによって返された行数および実行されたループ数が含まれます。MySQL 8.0.21 以降では、このステートメントは FORMAT=TREE指定子もサポートしています。 サポートされている形式はTREEのみです。詳しくはEXPLAIN ANALYZE による情報の取得,をご覧ください。 
- 
クエリーキャスト注入. 8.0.18 以降のバージョンでは、MySQL は、引数のデータ型と予想されるデータ型が一致しない式および条件内のクエリーアイテムツリーにキャスト操作を注入します。 これはクエリー結果や実行速度には影響しませんが、以前のリリースの MySQL との下位互換性を維持しながら、クエリーを SQL 標準に準拠したものと同じように実行します。 このような暗黙的なキャストは、時間型 ( DATE,DATETIME,TIMESTAMP,TIME) と数値型 (SMALLINT,TINYINT,MEDIUMINT,INT/INTEGER、BIGINT;DECIMAL/NUMERIC;FLOAT,DOUBLE,REAL;BIT) の間で実行されます。いずれかの標準数値比較演算子 (=,>=,>,<,<=,<>/!=、または<=>) を使用して実行されるものです。 この場合、まだDOUBLEではない値はキャストされます。 キャストインジェクションは、DATEまたはTIMEの値とDATETIMEの値の比較に対しても実行されるようになりました。引数はDATETIMEとして必要に応じてキャストされます。MySQL 8.0.21 以降、このようなキャストは、文字列型を他の型と比較するときにも実行されます。 キャストされる文字列型には、 CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUMおよびSETがあります。 文字列型の値を数値型またはYEARと比較する場合、文字列のキャストはDOUBLEになります。他の引数の型がFLOAT、DOUBLEまたはREALでない場合は、DOUBLEにもキャストされます。 文字列型をDATETIMEまたはTIMESTAMP値と比較する場合、文字列はDATETIMEにキャストされ、文字列型をDATEと比較する場合、文字列はDATEにキャストされます。次に示すように、 EXPLAIN ANALYZE、EXPLAIN FORMAT=JSONまたはEXPLAIN FORMAT=TREEの出力を表示することで、特定のクエリーにキャストが注入されるタイミングを確認できます:mysql> CREATE TABLE d (dt DATETIME, d DATE, t TIME); Query OK, 0 rows affected (0.62 sec) mysql> CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL); Query OK, 0 rows affected (0.51 sec) mysql> CREATE TABLE s (c CHAR(25), vc VARCHAR(25), -> bn BINARY(50), vb VARBINARY(50), b BLOB, t TEXT, -> e ENUM('a', 'b', 'c'), se SET('x' ,'y', 'z')); Query OK, 0 rows affected (0.50 sec) mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G *************************** 1. row *************************** EXPLAIN: -> Inner hash join (cast(d.dt as double) = cast(n.i as double)) (cost=0.70 rows=1) -> Table scan on n (cost=0.35 rows=1) -> Hash -> Table scan on d (cost=0.35 rows=1) mysql> EXPLAIN FORMAT=TREE SELECT * from s JOIN d ON d.dt = s.c\G *************************** 1. row *************************** EXPLAIN: -> Inner hash join (d.dt = cast(s.c as datetime(6))) (cost=0.72 rows=1) -> Table scan on d (cost=0.37 rows=1) -> Hash -> Table scan on s (cost=0.35 rows=1) 1 row in set (0.01 sec) mysql> EXPLAIN FORMAT=TREE SELECT * from n JOIN s ON n.d = s.c\G *************************** 1. row *************************** EXPLAIN: -> Inner hash join (cast(n.d as double) = cast(s.c as double)) (cost=0.70 rows=1) -> Table scan on s (cost=0.35 rows=1) -> Hash -> Table scan on n (cost=0.35 rows=1) 1 row in set (0.00 sec)このようなキャストは、 EXPLAIN [FORMAT=TRADITIONAL]を実行することでも確認できます。この場合、EXPLAINステートメントの実行後にSHOW WARNINGSを発行する必要もあります。
- 
TIMESTAMP および DATETIME のタイムゾーンサポート. MySQL 8.0.19 の時点では、サーバーは日時 ( TIMESTAMPおよびDATETIME) 値が挿入されたタイムゾーンオフセットを受け入れます。 このオフセットは、time_zoneシステム変数の設定時に採用されたフォーマットと同じフォーマットを使用しますが、オフセットの時間部分が 10 未満で、'-00:00'が許可されていない場合に先行ゼロが必要になる点が異なります。 タイムゾーンオフセットを含む日時リテラルの例には、'2019-12-11 10:40:30-05:00'、'2003-04-14 03:30:00+10:00'および'2020-01-01 15:35:45+05:30'があります。日時値を選択する場合、タイムゾーンオフセットは表示されません。 タイムゾーンオフセットを組み込む日時リテラルは、プリペアドコンパイルされたステートメントのパラメータ値として使用できます。 この作業の一環として、 time_zoneシステム変数の設定に使用される値も、-14:00から+14:00までの範囲に制限されるようになりました。 (MySQL タイムゾーンテーブルがロードされている場合は、time_zoneに、'EST'、'Posix/Australia/Brisbane'、および'Europe/Stockholm'といった名前の値を割り当てることができます。タイムゾーンテーブルへの移入 を参照してください)。詳細および例は、セクション5.1.15「MySQL Server でのタイムゾーンのサポート」 および セクション11.2.2「DATE、DATETIME、および TIMESTAMP 型」 を参照してください。 
- 
JSON スキーマの CHECK 制約の失敗に関する正確な情報. JSON_SCHEMA_VALID()を使用してCHECK制約を指定する場合、MySQL 8.0.19 以降では、このような制約の失敗の理由に関する正確な情報が提供されます。例および詳細は、JSON_SCHEMA_VALID() および CHECK 制約 を参照してください。 セクション13.1.20.6「CHECK 制約」も参照してください。 
- 
ON DUPLICATE KEY UPDATE を使用した行およびカラムのエイリアス. MySQL 8.0.19 以降では、エイリアスを使用して、挿入する行およびそのカラム (オプション) を参照できます。 カラム aおよびbを含むテーブルtで、次のINSERTステートメントを考えてみます:INSERT INTO t SET a=9,b=5 ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);新しい行にエイリアス newを使用し、場合によっては、この行のカラムにエイリアスmおよびnを使用すると、INSERTステートメントを様々な方法でリライトできます。次に例をいくつか示します:INSERT INTO t SET a=9,b=5 AS new ON DUPLICATE KEY UPDATE a=new.a+new.b; INSERT INTO t VALUES(9,5) AS new ON DUPLICATE KEY UPDATE a=new.a+new.b; INSERT INTO t SET a=9,b=5 AS new(m,n) ON DUPLICATE KEY UPDATE a=m+n; INSERT INTO t VALUES(9,5) AS new(m,n) ON DUPLICATE KEY UPDATE a=m+n;詳細および例については、セクション13.2.6.2「INSERT ... ON DUPLICATE KEY UPDATE ステートメント」を参照してください。 
- 
SQL 標準の明示的なテーブル句およびテーブル値コンストラクタ. SQL 標準に従って、テーブル値コンストラクタおよび明示的なテーブル句が追加されました。 これらは、それぞれ TABLEステートメントおよびVALUESステートメントとして MySQL 8.0.19 に実装されます。TABLEステートメントの形式はTABLEで、table_nameSELECT * FROMと同等です。table_nameORDER BY句およびLIMIT句 (後者はオプションでOFFSETで併用可) はサポートされますが、個々のテーブルのカラムを選択することはできません。TABLEは、同等のSELECTステートメントを使用できる場所であればどこでも使用できます。これには、JOIN、UNION、INSERT ... SELECT,REPLACE,CREATE TABLE ... SELECTステートメントおよびサブクエリーが含まれます。 例:- TABLE t1 UNION TABLE t2は- SELECT * FROM t1 UNION SELECT * FROM t2と同等です
- CREATE TABLE t2 TABLE t1は- CREATE TABLE t2 SELECT * FROM t1と同等です
- SELECT a FROM t1 WHERE b > ANY (TABLE t2)は、- SELECT a FROM t1 WHERE b > ANY (SELECT * FROM t2)と同等です。
 VALUESは、INSERT、REPLACEまたはSELECTステートメントにテーブルの値を指定するために使用でき、VALUESキーワードの後にカンマで区切られた一連の行コンストラクタ (ROW()) が続きます。 たとえば、SQL 標準に準拠したINSERT INTO t1 VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9)というステートメントは、MySQL 固有のINSERT INTO t1 VALUES (1,2,3), (4,5,6), (7,8,9)と同等です。 テーブルと同じように、VALUESテーブルの値コンストラクタから選択することもできます (これには、テーブルのエイリアスを指定しなければならないことに注意)。これは他のSELECTと同じように使えます。JOIN、UNION およびサブクエリーを含みます。TABLEおよびVALUESの詳細とその使用例は、このドキュメントの次のセクションを参照してください:
- 
FORCE INDEX、IGNORE INDEX のオプティマイザヒント. MySQL 8.0 では、セクション8.9.4「インデックスヒント」 で説明されている従来のインデックスヒントと同様に機能するインデックスレベルのオプティマイザヒントが導入されています。 新しいヒントとそれに相当する FORCE INDEXまたはIGNORE INDEXのヒントを次に示します:- 
GROUP_INDEX:FORCE INDEX FOR GROUP BYと同等NO_GROUP_INDEX:IGNORE INDEX FOR GROUP BYと同等
- 
JOIN_INDEX:FORCE INDEX FOR JOINと同等NO_JOIN_INDEX:IGNORE INDEX FOR JOINと同等
- 
ORDER_INDEX:FORCE INDEX FOR ORDER BYと同等NO_ORDER_INDEX:IGNORE INDEX FOR ORDER BYと同等
- 
INDEX:GROUP_INDEXにJOIN_INDEXとORDER_INDEXを加えたものと同じです。修飾子のないFORCE INDEXと同等ですNO_INDEX:NO_GROUP_INDEXにNO_JOIN_INDEXとNO_ORDER_INDEXを加えたものと同じです。修飾子のないIGNORE INDEXと同等です
 たとえば、次の 2 つのクエリーは同等です。 SELECT a FROM t1 FORCE INDEX (i_a) FOR JOIN WHERE a=1 AND b=2; SELECT /*+ JOIN_INDEX(t1 i_a) */ a FROM t1 WHERE a=1 AND b=2;前述のオプティマイザヒントは、既存のインデックスレベルのオプティマイザヒントと同じ構文および使用方法の基本ルールに従います。 これらのオプティマイザヒントは、将来の MySQL リリースで非推奨になり、その後 MySQL から削除する予定の FORCE INDEXおよびIGNORE INDEXを置き換えることを目的としています。USE INDEXに同等の単一のものは実装されません。かわりに、NO_INDEX,NO_JOIN_INDEX,NO_GROUP_INDEXまたはNO_ORDER_INDEXのいずれかを使用して同じ効果を得ることができます。詳細および使用例は、インデックスレベルのオプティマイザヒント を参照してください。 
- 
- 
JSON_VALUE() 関数. MySQL 8.0.21 には、 JSONカラムのインデックス付けを簡略化するための新しい関数JSON_VALUE()が実装されています。 最も基本的な形式では、引数として JSON ドキュメントおよびそのドキュメント内の単一の値を指す JSON パスを取り、オプションでRETURNINGキーワードを使用して戻り型を指定できます。JSON_VALUE(は次と同等です:json_doc,pathRETURNINGtype)CAST( JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) ) AS type );JSON_TABLE()で採用されている場合と同様に、ON EMPTY、ON ERROR、またはその両方の句を指定することもできます。JSON_VALUE()を使用して、次のようにJSONカラムの式にインデックスを作成できます:CREATE TABLE t1( j JSON, INDEX i1 ( (JSON_VALUE(j, '$.id' RETURNING UNSIGNED)) ) ); INSERT INTO t1 VALUES ROW('{"id": "123", "name": "shoes", "price": "49.95"}');次に示すように、この式を使用するクエリーではインデックスを使用できます: SELECT name, price FROM t1 WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;多くの場合、これは、 JSONカラムから生成カラムを作成し、生成カラムにインデックスを作成するよりも簡単です。詳細および例は、 JSON_VALUE()の説明を参照してください。
- 
ユーザーコメントとユーザー属性. MySQL 8.0.21 では、ユーザーアカウントの作成または更新時にユーザーコメントおよびユーザー属性を設定する機能が導入されています。 ユーザーコメントは、 CREATE USERステートメントまたはALTER USERステートメントで使用されるCOMMENT句に引数として渡される任意のテキストで構成されます。 ユーザー属性は、これらのステートメントのいずれかで使用されるATTRIBUTE句に引数として渡される JSON オブジェクトの形式のデータで構成されます。 属性には、JSON オブジェクト表記法の有効なキーと値のペアを含めることができます。 単一のCREATE USERステートメントまたはALTER USERステートメントで使用できるのは、COMMENTまたはATTRIBUTEのいずれかのみです。ユーザーコメントとユーザー属性は JSON オブジェクトとして内部的に格納され、コメントテキストはキーとして commentを持つ要素の値として格納されます。 この情報は、INFORMATION_SCHEMA.USER_ATTRIBUTESテーブルのATTRIBUTEカラムから取得できます。JSON 形式であるため、MySQL JSON 関数および演算子を使用して内容を解析できます (セクション12.18「JSON 関数」 を参照)。 ユーザー属性に対する後続の変更は、JSON_MERGE_PATCH()関数を使用する場合と同様に現在の値とマージされます。例: mysql> CREATE USER 'mary'@'localhost' COMMENT 'This is Mary Smith\'s account'; Query OK, 0 rows affected (0.33 sec) mysql> ALTER USER 'mary'@'localhost' -≫ ATTRIBUTE '{"fname":"Mary", "lname":"Smith"}'; Query OK, 0 rows affected (0.14 sec) mysql> ALTER USER 'mary'@'localhost' -≫ ATTRIBUTE '{"email":"mary.smith@example.com"}'; Query OK, 0 rows affected (0.12 sec) mysql> SELECT -> USER, -> HOST, -> ATTRIBUTE->>"$.fname" AS 'First Name', -> ATTRIBUTE->>"$.lname" AS 'Last Name', -> ATTRIBUTE->>"$.email" AS 'Email', -> ATTRIBUTE->>"$.comment" AS 'Comment' -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES -> WHERE USER='mary' AND HOST='localhost'\G *************************** 1. row *************************** USER: mary HOST: localhost First Name: Mary Last Name: Smith Email: mary.smith@example.com Comment: This is Mary Smith's account 1 row in set (0.00 sec)詳細および例は、セクション13.7.1.3「CREATE USER ステートメント」、セクション13.7.1.1「ALTER USER ステートメント」 および セクション26.46「INFORMATION_SCHEMA USER_ATTRIBUTES テーブル」 を参照してください。 
- 
新しい optimizer_switch フラグ. MySQL 8.0.21 では、次のリストに示すように、 optimizer_switchシステム変数に 2 つの新しいフラグが追加されます:- 
prefer_ordering_indexフラグデフォルトでは、MySQL は LIMIT句を持つORDER BYまたはGROUP BYクエリーに対して順序付けされたインデックスを使用しようとします。オプティマイザは、この結果、実行速度が速くなると判断します。 このようなクエリーに対して異なる最適化を選択する方が実際にパフォーマンスが向上する場合があるため、prefer_ordering_indexフラグをoffに設定することで、この最適化を無効にできるようになりました。このフラグのデフォルト値は onです。
- 
subquery_to_derivedフラグこのフラグが onに設定されている場合、オプティマイザは適格なスカラーサブクエリーを導出テーブルの結合に変換します。 たとえば、クエリーSELECT * FROM t1 WHERE t1.a > (SELECT COUNT(a) FROM t2)はSELECT t1.a FROM t1 JOIN ( SELECT COUNT(t2.a) AS c FROM t2 ) AS d WHERE t1.a > d.cとしてリライトされます。この最適化は、 SELECT,WHERE,JOIN句またはHAVING句の一部であるサブクエリーに適用できます。1 つ以上の集計関数は含まれますが、GROUP BY句は含まれません。相関関係はなく、非決定的関数は使用されません。最適化は、 IN,NOT IN,EXISTSまたはNOT EXISTSの引数であり、GROUP BYを含まないテーブルサブクエリーにも適用できます。 たとえば、クエリーSELECT * FROM t1 WHERE t1.b < 0 OR t1.a IN (SELECT t2.a + 1 FROM t2)はSELECT a, b FROM t1 LEFT JOIN (SELECT DISTINCT 1 AS e1, t2.a AS e2 FROM t2) d ON t1.a + 1 = d.e2 WHERE t1.b < 0 OR d.e1 IS NOT NULLとしてリライトされます。この最適化は、ほとんどの場合に顕著なパフォーマンスの向上をもたらさないため、通常は無効になっています。フラグはデフォルトで offに設定されます。
 詳細は、セクション8.9.2「切り替え可能な最適化」を参照してください。 セクション8.2.1.19「LIMIT クエリーの最適化」、セクション8.2.2.1「準結合変換による IN および EXISTS サブクエリー述語の最適化」 および セクション8.2.2.4「マージまたは実体化を使用した導出テーブル、ビュー参照および共通テーブル式の最適化」 も参照してください。 
- 
- XML の拡張機能. MySQL 8.0.21 では、 - LOAD XMLステートメントで XML の- CDATAセクションのインポートがサポートされるようになりました。
- 
YEAR 型へのキャストがサポートされるようになりました. MySQL 8.0.22 以降、サーバーは YEARへのキャストを許可します。CAST()関数とCONVERT()関数の両方で、単一桁、2 桁および 4 桁のYEAR値がサポートされています。 1 桁および 2 桁の値の場合、使用できる範囲は 0-99 です。 4 桁の値は 1901-2155 の範囲内である必要があります。YEARは、JSON_VALUE()関数の戻り型としても使用できます。この関数は 4 桁の年のみをサポートします。文字列、日時および浮動小数点値はすべて YEARにキャストできます。GEOMETRY値のYEARへのキャストはサポートされていません。変換ルールを含む詳細は、 CONVERT()関数の説明を参照してください。
- 
TIMESTAMP 値の UTC としての取得. MySQL 8.0.22 以降では、 CAST(を使用した、取得時のシステムタイムゾーンから UTCvalueAT TIME ZONEspecifierAS DATETIME)DATETIMEへのTIMESTAMPカラム値の変換がサポートされています。ここで、指定子は[INTERVAL] '+00:00'または'UTC'のいずれかです。 キャストによって返されるDATETIME値の精度は、必要に応じて小数点以下 6 桁まで指定できます。ARRAYキーワードは、この構成ではサポートされていません。タイムゾーンオフセットを使用してテーブルに挿入された TIMESTAMP値もサポートされます。AT TIME ZONEの使用は、CONVERT()またはその他の MySQL 関数や構造体ではサポートされていません。詳細および例は、 CAST()関数の説明を参照してください。
- 
ダンプファイル出力の同期. MySQL 8.0.22 以降では、 SELECT INTO DUMPFILEおよびSELECT INTO OUTFILEステートメントによるファイルへの書込み時に定期的な同期がサポートされます。 これを有効にするには、select_into_disk_syncシステム変数をONに設定します。書込みバッファのサイズは、select_into_buffer_sizeに設定された値によって決まります。デフォルトは 131072 (2 17) バイトです。また、ディスクへの同期後のオプションの遅延は、 select_into_disk_sync_delayを使用して設定できます。デフォルトは遅延なし (0 ミリ秒) です。詳細は、この項目で前述した変数の説明を参照してください。 
- 
ステートメントの準備の単一化. MySQL 8.0.22 の時点では、プリペアドステートメントは、実行されるたびに一度ではなく、最初に一度だけ準備されます。 これは、 PREPAREの実行時に行われます。 これは、ストアドプロシージャ内のすべてのステートメントにも当てはまります。このステートメントは、ストアドプロシージャが最初に実行されたときに一度準備されます。この変更の結果、プリペアドステートメントで使用される動的パラメータが解決される方法も、次に示す方法で変更されます: - 
プリペアドステートメントのパラメータには、ステートメントの準備時にデータ型が割り当てられます。ステートメントが再準備されないかぎり、ステートメントの後続の実行ごとに型が保持されます。次を参照してください。 準備されたステートメント内の特定のパラメータまたはユーザー変数に別のデータ型を使用して最初の実行後にステートメントを実行すると、ステートメントが再準備される可能性があります。このため、準備されたステートメントを再実行するときは、指定されたパラメータに同じデータ型を使用することをお薦めします。 
- 
ウィンドウ関数を使用する次の構造体は、SQL 標準に合せるために受け入れられなくなりました: - NTILE(NULL)
- NTH_VALUE(- expr, NULL)
- LEAD(および- expr,- nn)- LAG((- expr,- nn)- nnは負数)
 これにより、SQL 標準への準拠が容易になります。 詳細は、個々の関数の説明を参照してください。 
- プリペアドステートメント内で参照されるユーザー変数のデータ型は、ステートメントの準備時に決定されるようになりました。この型は、ステートメントの後続の実行ごとに保持されます。 
- ストアドプロシージャ内で実行されるステートメントによって参照されるユーザー変数のデータ型は、ステートメントの初回実行時に決定されるようになりました。この型は、格納されているストアドプロシージャの後続の起動でも保持されます。 
- SELECT形式のプリペアドステートメントを実行するときに、パラメータに整数値- expr1,- expr2, ... FROM- tableORDER BY ?- Nを渡すと、選択リストの- Nth 式による結果の順序付けが行われなくなります。- ORDER BYで期待される通りには、結果が順序付けされなくなります。- constant
 プリペアドステートメントとして、またはストアドプロシージャ内で使用されるステートメントとして最初に一度だけ準備することにより、ステートメントのパフォーマンスが向上します。これは、繰返し準備の追加コストが削減されるためです。 これにより、MySQL での多数の問題の原因となった準備構造の複数のロールバックを回避することもできます。 詳細は、セクション13.5.1「PREPARE ステートメント」を参照してください。 
- 
- LEFT JOIN 処理としての RIGHT JOIN. MySQL 8.0.22 点では、サーバーは - RIGHT JOINのすべてのインスタンスを- LEFT JOINとして内部的に処理することで、パース時に完全な変換が行われないいくつかの特別なケースを排除しました。
- 
導出条件プッシュダウン最適化. MySQL 8.0.22 (以降) は、実体化導出テーブルを持つクエリーの導出条件プッシュダウンを実装します。 SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i >などのクエリーでは、多くの場合、外部constantWHERE条件を導出テーブルにプッシュできるようになりました (この場合、SELECT * FROM (SELECT i, j FROM t1 WHERE i >になります)。constant) AS dt以前は、導出テーブルが実体化されてマージされていない場合、MySQL はテーブル全体を実体化し、 WHERE条件で行を修飾していました。 導出条件プッシュダウン最適化を使用してWHERE条件をサブクエリーに移動すると、多くの場合、処理が必要な行数が減り、クエリーの実行に必要な時間が短縮されます。導出テーブルで集計関数またはウィンドウ関数が使用されていない場合は、外部 WHERE条件を実体化導出テーブルに直接プッシュダウンできます。 導出テーブルにGROUP BYがあり、ウィンドウ関数を使用しない場合、外部WHERE条件をHAVING条件として導出テーブルにプッシュダウンできます。 導出テーブルがウィンドウ関数を使用し、外部WHEREがウィンドウ関数のPARTITION句で使用されるカラムを参照している場合は、WHERE条件をプッシュダウンすることもできます。導出条件プッシュダウンは、 optimizer_switchシステム変数derived_condition_pushdownフラグで示されるように、デフォルトで有効になっています。 MySQL 8.0.22 で追加されたフラグは、デフォルトでonに設定されています。特定のクエリーの最適化を無効にするには、NO_DERIVED_CONDITION_PUSHDOWNオプティマイザヒント (こちらも MySQL 8.0.22 で追加) を使用できます。derived_condition_pushdownがoffに設定されているために最適化が無効になっている場合は、DERIVED_CONDITION_PUSHDOWNを使用して特定のクエリーに対して最適化を有効にできます。導出条件プッシュダウン最適化は、 UNION句またはLIMIT句を含む導出テーブルには使用できません。 また、サブクエリーを使用する条件自体はプッシュダウンできず、外部結合の内部テーブルでもある導出テーブルにWHERE条件をプッシュダウンすることもできません。 追加情報および例については、セクション8.2.2.5「導出条件プッシュダウン最適化」を参照してください。
- 
MySQL 付与テーブルでの非ロック読み取り. MySQL 8.0.22 では、MySQL 付与テーブルに対する同時 DML 操作および DDL 操作を許可するために、MySQL 付与テーブルに対して以前に行ロックを取得した読取り操作は、非ロック読取りとして実行されます。 MySQL 付与テーブルで非ロック読み取りとして実行されるようになった操作には、次のものがあります: - 任意のトランザクション分離レベルを使用して、結合リストおよびサブクエリー ( - SELECT ... FOR SHAREステートメントを含む) を介して付与テーブルからデータを読み取る- SELECTステートメントおよびその他の読取り専用ステートメント。
- 任意のトランザクション分離レベルを使用して (結合リストまたはサブクエリーを介して) 付与テーブルからデータを読み取り、変更を伴わない DML 操作。 
 追加情報については テーブル同時実行性の付与を参照してください。 
次の機能は MySQL 8.0 では非推奨であり、将来のシリーズで削除される可能性があります。 ほかのオプションがあれば、それを利用するためにアプリケーションを更新する必要があります。
上位の MySQL シリーズで削除された MySQL 8.0 で非推奨になった機能を使用するアプリケーションの場合、MySQL 8.0 ソースから上位シリーズのレプリカにレプリケートするとステートメントが失敗するか、ソースとレプリカに異なる影響を与える可能性があります。 このような問題を回避するには、8.0 で非推奨になった機能を使用するアプリケーションを改訂して回避し、可能な場合は代替機能を使用する必要があります。
- 
utf8mb3文字セットは非推奨です。 かわりにutf8mb4を使用してください。
- 
caching_sha2_passwordは MySQL 8.0 のデフォルトの認証プラグインであり、sha256_password認証プラグインの機能のスーパーセットを提供するため、sha256_passwordは非推奨になりました。将来のバージョンの MySQL で削除される予定です。sha256_passwordを使用して認証する MySQL アカウントは、かわりにcaching_sha2_passwordを使用するように移行する必要があります。
- 
validate_passwordプラグインは、コンポーネントインフラストラクチャを使う形式で再実装されました。 プラグイン形式のvalidate_passwordは引き続き使用可能ですが、非推奨になりました。将来のバージョンの MySQL で削除される予定です。 プラグインを使用する MySQL インストールでは、かわりにコンポーネントの使用に移行する必要があります。 セクション6.4.3.3「パスワード検証コンポーネントへの移行」を参照してください。
- 
ALTER TABLESPACEおよびDROP TABLESPACEステートメントのENGINE句は非推奨になりました。
- 
PAD_CHAR_TO_FULL_LENGTHSQL モードは非推奨です。
- 
AUTO_INCREMENTのサポートは、FLOAT型およびDOUBLE型のカラム (およびシノニム) では非推奨です。 このようなカラムからAUTO_INCREMENT属性を削除するか、整数型に変換することを検討してください。
- 
UNSIGNED属性は、FLOAT、DOUBLEおよびDECIMAL(およびシノニム) 型のカラムでは非推奨です。 このようなカラムには、かわりに単純なCHECK制約の使用を検討してください。
- 
FLOATおよびDOUBLE(およびシノニム) 型のカラムの桁数を指定するためのFLOAT(およびM,D)DOUBLE(構文は、非標準 MySQL 拡張機能です。 この構文は非推奨です。M,D)
- ZEROFILL属性は、整数データ型の表示幅属性と同様に、数値データ型では非推奨です。 これらの属性の効果を生成する別の方法の使用を検討してください。 たとえば、アプリケーションでは、- LPAD()関数を使用して、必要な幅まで数値をゼロ埋めたり、書式設定された数値を- CHARカラムに格納したりできます。
- 
文字列データ型の場合、 BINARY属性は、カラム文字セット (またはカラム文字セットが指定されていない場合はテーブルのデフォルト文字セット) のバイナリ (_bin) 照合順序を指定するための短縮形である非標準の MySQL 拡張機能です。 MySQL 8.0 では、utf8mb4文字セットに複数の_bin照合順序があるため、このBINARYの非標準の使用はあいまいです。このため、BINARY属性は非推奨になりました。将来のバージョンの MySQL ではサポートされなくなる予定です。 かわりに、明示的な_bin照合を使用するようにアプリケーションを調整する必要があります。BINARYを使用してデータ型または文字セットを指定する方法は変わりません。
- 
標準の SQL AND、ORおよびNOT演算子のシノニムである非標準の C 形式の&&、||および!演算子は、それぞれ非推奨になりました。 非標準演算子を使用するアプリケーションは、標準演算子を使用するように調整する必要があります。注記PIPES_AS_CONCATSQL モードが有効になっていないかぎり、||の使用は非推奨です。 その場合、||は SQL 標準の文字列連結演算子を示します。
- 
JSON_MERGE()関数は非推奨です。 かわりにJSON_MERGE_PRESERVE()を使用してください。
- 
SQL_CALC_FOUND_ROWSクエリー修飾子および付随するFOUND_ROWS()関数は非推奨です。 代替戦略の詳細は、FOUND_ROWS()の説明を参照してください。
- 
CREATE TEMPORARY TABLEでのTABLESPACE = innodb_file_per_table句およびTABLESPACE = innodb_temporary句のサポートは、MySQL 8.0.13 で非推奨になりました。
- 
SELECTステートメントの場合、FROMの後にINTO句を使用することはできますが、SELECTの最後には使用できません (MySQL 8.0.20 の時点では非推奨です)。 ステートメントの最後にINTOを配置することをお薦めします。UNIONステートメントの場合、INTOを含む次の 2 つのバリアントは、MySQL 8.0.20 で非推奨になりました:- クエリー式の後続のクエリーブロックでは、 - FROMの前に- INTOを使用します。
- クエリー式のカッコで囲まれた後続ブロックでは、 - FROMに対する相対位置に関係なく、- INTOを使用します。
 セクション13.2.10.1「SELECT ... INTO ステートメント」およびセクション13.2.10.3「UNION 句」を参照してください。 
- 
FLUSH HOSTSは、MySQL 8.0.23 の時点では非推奨です。 代わりに、パフォーマンススキーマhost_cacheテーブルを切り捨てます:TRUNCATE TABLE performance_schema.host_cache;TRUNCATE TABLE操作には、テーブルに対するDROP権限が必要です。
- 
mysqlシステムスキーマ内のシステムテーブルおよび他のスキーマ内のオブジェクトをアップグレードする機能が MySQL サーバーに移動されたため、mysql_upgrade クライアントは非推奨になりました。 セクション2.11.3「MySQL のアップグレードプロセスの内容」を参照してください。
- 
--no-dd-upgradeサーバーオプションは非推奨です。 データディクショナリおよびサーバーのアップグレード動作をより細かく制御できる--upgradeオプションに置き換えられています。
- 
データディレクトリが作成され、MySQL のバージョン番号の格納に使用される mysql_upgrade_infoファイルは非推奨になりました。将来のバージョンの MySQL で削除される予定です。
- 
relay_log_info_fileシステム変数および--master-info-fileオプションは非推奨になりました。 以前は、これらはrelay_log_info_repository=FILEおよびmaster_info_repository=FILEの設定時にリレーログ情報ログおよびソース情報ログの名前を指定するために使用されていましたが、これらの設定は非推奨になりました。 リレーログ情報ログおよびソース情報ログのファイルの使用は、MySQL 8.0 のデフォルトであるクラッシュセーフレプリカテーブルに置き換えられました。
- 
max_length_for_sort_dataシステム変数は、オプティマイザの変更によって廃止され、効果がないため、非推奨になりました。
- 
サーバーへの接続を圧縮するためのこれらのレガシーパラメータは非推奨です: --compressクライアントのコマンド行オプション、mysql_options()C API 関数のMYSQL_OPT_COMPRESSオプション、slave_compressed_protocolシステム変数。 かわりに使用するパラメータの詳細は、セクション4.2.8「接続圧縮制御」 を参照してください。
- 
MYSQL_PWD環境変数を使用した MySQL パスワードの指定は非推奨です。
- 
VALUES()を使用したINSERT ... ON DUPLICATE KEY UPDATEの新しい行値へのアクセスは、MySQL 8.0.20 では非推奨です。 かわりに、新しい行とカラムにエイリアスを使用します。
- 
JSON_TABLE()の呼び出し時にON EMPTYの前にON ERRORを指定することは SQL 標準に反しているため、この構文は MySQL で非推奨になりました。 MySQL 8.0.20 以降では、試行するたびにサーバーによって警告が出力されます。 単一のJSON_TABLE()起動でこれらの句の両方を指定する場合は、ON EMPTYが最初に使用されていることを確認してください。
- 
インデックス接頭辞を持つカラムは、テーブルパーティション化キーの一部としてサポートされるいません。以前は、パーティションテーブルの作成、変更またはアップグレード時に許可されていましたが、テーブルパーティション化関数によって除外され、これがサーバーによって警告を発することはありませんでした。 以前許可されていた動作は非推奨になり、将来のバージョンの MySQL で削除される (パーティション化キーでこのようなカラムを使用すると、 CREATE TABLEまたはALTER TABLEステートメントが拒否される) 可能性があります。MySQL 8.0.21 では、インデックス接頭辞を使用するカラムがパーティション化キーの一部として指定されるたびに、そのようなカラムごとに警告が生成されます。 提案されたパーティション化キーのすべてのカラムにインデックス接頭辞があるために CREATE TABLEまたはALTER TABLEステートメントが拒否されると、結果のエラーに拒否の正確な理由が示されるようになりました。 どちらの場合も、これには、空のPARTITION BY KEY()句を使用して、パーティション化関数で使用されるカラムがテーブルの主キーのカラムとして暗黙的に定義されるケースが含まれます。詳細および例については、カラムインデックス接頭辞はキーパーティション化ではサポートされていませんを参照してください。 
- 
InnoDB memcached プラグインは、MySQL 8.0.22 の時点では非推奨です。将来のバージョンの MySQL ではサポートされなくなる予定です。 
次の項目は廃止され、MySQL 8.0 で削除されました。 ほかのオプションがあれば、それを利用するためにアプリケーションを更新する必要があります。
MySQL 8.0 で削除された機能を使用する MySQL 5.7 アプリケーションの場合、MySQL 5.7 ソースから MySQL 8.0 レプリカにレプリケートするとステートメントが失敗するか、ソースとレプリカに異なる影響を与える可能性があります。 このような問題を回避するには、MySQL 8.0 で削除された機能を使用するアプリケーションを改訂して回避し、可能な場合は代替機能を使用する必要があります。
- 
innodb_locks_unsafe_for_binlogシステム変数が削除されました。READ COMMITTED分離レベルは、同様の機能を提供します。
- 
MySQL 8.0.0 で導入された information_schema_stats変数は、MySQL 8.0.3 でinformation_schema_stats_expiryによって削除および置換されました。information_schema_stats_expiryは、キャッシュされたINFORMATION_SCHEMAテーブル統計の有効期限設定を定義します。 詳細は、セクション8.2.3「INFORMATION_SCHEMA クエリーの最適化」を参照してください。
- 
廃止された InnoDBシステムテーブルに関連するコードは、MySQL 8.0.3 で削除されました。InnoDBシステムテーブルに基づくINFORMATION_SCHEMAビューは、データディクショナリテーブルの内部システムビューに置き換えられました。 影響を受けるInnoDBINFORMATION_SCHEMAビューの名前が変更されました:表 1.1 名前が変更された InnoDB 情報スキーマビュー 旧名称 新規名 INNODB_SYS_COLUMNSINNODB_COLUMNSINNODB_SYS_DATAFILESINNODB_DATAFILESINNODB_SYS_FIELDSINNODB_FIELDSINNODB_SYS_FOREIGNINNODB_FOREIGNINNODB_SYS_FOREIGN_COLSINNODB_FOREIGN_COLSINNODB_SYS_INDEXESINNODB_INDEXESINNODB_SYS_TABLESINNODB_TABLESINNODB_SYS_TABLESPACESINNODB_TABLESPACESINNODB_SYS_TABLESTATSINNODB_TABLESTATSINNODB_SYS_VIRTUALINNODB_VIRTUALMySQL 8.0.3 以上にアップグレードした後、以前の InnoDBINFORMATION_SCHEMAビュー名を参照するスクリプトを更新します。
- 
アカウント管理に関連する次の機能が削除されました: - 
GRANTを使用したユーザーの作成。 かわりに、CREATE USERを使用してください。 この変更により、NO_AUTO_CREATE_USERSQL モードがGRANTステートメントで不要になったため、これも削除されました。オプションファイルのsql_modeオプションにこの値の記述があることによって mysqld の起動ができない場合は、サーバーログにエラーが書き込まれるようになります。
- GRANTを使用した権限割当て以外のアカウントプロパティの変更。 これには、認証、SSL およびリソース制限のプロパティが含まれます。 かわりに、- CREATE USERを使用してアカウント作成時にこのようなプロパティを設定するか、後で- ALTER USERを使用して変更します。
- 
CREATE USERおよびGRANTのIDENTIFIED BY PASSWORD '構文。 かわりに、auth_string'IDENTIFIED WITHforauth_pluginAS 'auth_string'CREATE USERandALTER USERを使用します。ここで、'値は指定されたプラグインと互換性のある形式です。auth_string'また、 IDENTIFIED BY PASSWORD構文が削除されたため、log_builtin_as_identified_by_passwordシステム変数は不要になり、削除されました。
- 
PASSWORD()関数。 なお、PASSWORD()の削除とは、SET PASSWORD ... = PASSWORD('構文が使用できなくなったことを意味します。auth_string')
- 
old_passwordsシステム変数。
 
- 
- 
クエリーキャッシュが削除されました。 削除には次の項目が含まれます: - 
FLUSH QUERY CACHEおよびRESET QUERY CACHEステートメント。
- 
これらのシステム変数: query_cache_limit,query_cache_min_res_unit,query_cache_size,query_cache_type,query_cache_wlock_invalidate。
- 
これらのステータス変数: Qcache_free_blocks,Qcache_free_memory,Qcache_hits,Qcache_inserts,Qcache_lowmem_prunes,Qcache_not_cached,Qcache_queries_in_cache,Qcache_total_blocks。
- 
これらのスレッド状態: checking privileges on cached query,checking query cache for query,invalidating query cache entries,sending cached result to client,storing result in query cache,Waiting for query cache lock。
- 
SQL_CACHESELECT修飾子。
 これらの非推奨のクエリーキャッシュアイテムは非推奨のままですが、効果はありません。将来の MySQL リリースで削除される予定です: - SQL_NO_CACHE- SELECT修飾子。
- ndb_cache_check_timeシステム変数。
 have_query_cacheシステム変数は非推奨のままであり、常にNOの値を持ちます。将来の MySQL リリースで削除される予定です。
- 
- 
データディクショナリはデータベースオブジェクトに関する情報を提供するため、サーバーはデータディレクトリ内のディレクトリ名をチェックしてデータベースを検索しなくなります。 その結果、 --ignore-db-dirオプションとignore_db_dirsシステム変数は無意味となり、削除されました。
- メタデータログとも呼ばれる DDL ログが削除されました。 MySQL 8.0.3 以降、この機能はデータディクショナリの - innodb_ddl_logテーブルによって処理されます。 DDL ログの表示を参照してください。
- 
tx_isolationおよびtx_read_onlyシステム変数が削除されました。 かわりにtransaction_isolationおよびtransaction_read_onlyを使用してください。
- 
.frmファイルが廃止されたため、sync_frmシステム変数は削除されました。
- 
secure_authシステム変数および--secure-authクライアントオプションが削除されました。mysql_options()C API 関数のMYSQL_SECURE_AUTHオプションが削除されました。
- 
multi_range_countシステム変数が削除されます。
- 
log_warningsシステム変数および--log-warningsサーバーオプションが削除されました。 かわりにlog_error_verbosityシステム変数を使用してください。
- 
sql_log_binシステム変数のグローバルスコープが削除されました。sql_log_binにはセッションスコープのみとなり、@@GLOBAL.sql_log_binへのアクセスに依存するアプリケーションは修正する必要があります。
- 
metadata_locks_cache_sizeおよびmetadata_locks_hash_instancesシステム変数が削除されます。
- 
未使用の date_format,datetime_format,time_formatおよびmax_tmp_tablesシステム変数が削除されます。
- 
これらの非推奨の互換性 SQL モードは削除されました: DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS。 これらをsql_modeシステム変数に割り当てたり、mysqldump--compatibleオプションの許可された値として使用したりすることはできなくなりました。MAXDBの削除とは、CREATE TABLEまたはALTER TABLEのTIMESTAMPデータ型がTIMESTAMPとして扱われ、DATETIMEとして扱われなくなることを意味します。
- 
GROUP BY句の非推奨のASC修飾子またはDESC修飾子は削除されます。 以前にGROUP BYソートに依存していたクエリーでは、以前の MySQL バージョンとは異なる結果が生成される場合があります。 特定のソート順序を生成するには、ORDER BY句を指定します。
- 
EXPLAINステートメントのEXTENDEDおよびPARTITIONSキーワードは削除されました。 これらのキーワードは、その効果が常に有効になっているため不要です。
- 
次の暗号化関連項目が削除されます: 削除された暗号化機能のかわり: ENCRYPT()の場合は、一方向ハッシュのかわりにSHA2()を使用することを検討してください。 その他の場合は、かわりにAES_ENCRYPT()およびAES_DECRYPT()の使用を検討してください。
- 
MySQL 5.7 では、複数の名前で使用可能ないくつかの空間関数は、空間関数ネームスペースの一貫性を高めるために非推奨になりました。各空間関数名が ST_(正確な操作を実行する場合) またはMBR(最小境界矩形に基づいて操作を実行する場合) で始まるという目標です。 MySQL 8.0 では、非推奨となった関数は削除され、対応するST_およびMBR関数のみが残されます:- 
これらの関数は、 MBR名を優先して削除されます:Contains(),Disjoint(),Equals(),Intersects(),Overlaps(),Within()。
- 
これらの関数は、 ST_名を優先して削除されます:Area(),AsBinary(),AsText(),AsWKB(),AsWKT(),Buffer(),Centroid(),ConvexHull(),Crosses(),Dimension(),Distance(),EndPoint(),Envelope(),ExteriorRing(),GeomCollFromText(),GeomCollFromWKB(),GeomFromText(),GeomFromWKB(),GeometryCollectionFromText(),GeometryCollectionFromWKB(),GeometryFromText(),GeometryFromWKB(),GeometryN(),GeometryType(),InteriorRingN(),IsClosed(),IsEmpty(),IsSimple(),LineFromText(),LineFromWKB(),LineStringFromText(),LineStringFromWKB(),MLineFromText(),MLineFromWKB(),MPointFromText(),MPointFromWKB(),MPolyFromText(),MPolyFromWKB(),MultiLineStringFromText(),MultiLineStringFromWKB(),MultiPointFromText(),MultiPointFromWKB(),MultiPolygonFromText(),MultiPolygonFromWKB(),NumGeometries(),NumInteriorRings(),NumPoints(),PointFromText(),PointFromWKB(),PointN(),PolyFromText(),PolyFromWKB(),PolygonFromText(),PolygonFromWKB(),SRID(),StartPoint(),Touches(),X(),Y()。
- 
GLength()は、ST_Length()を優先して削除されます。
 
- 
- 
セクション12.17.4「WKB 値からジオメトリ値を作成する関数」 で説明されている関数は、WKB 文字列またはジオメトリ引数を以前に受け入れていました。 ジオメトリ引数は許可されなくなり、エラーが発生します。 ジオメトリ引数を使用しないでクエリーを移行するためのガイドラインについては、そのセクションを参照してください。 
- 
パーサーは、SQL ステートメントで \NをNULLのシノニムとして処理しなくなりました。 かわりにNULLを使用してください。この変更は、 NULLが\Nによって引き続き表されるLOAD DATAまたはSELECT ... INTO OUTFILEで実行されるテキストファイルのインポートまたはエクスポート操作には影響しません。 セクション13.2.7「LOAD DATA ステートメント」を参照してください。
- 
PROCEDURE ANALYSE()構文が削除されました。
- 
クライアント側の --sslおよび--ssl-verify-server-certオプションが削除されました。--ssl=1または--enable-sslのかわりに--ssl-mode=REQUIREDを使用します。--ssl=0、--skip-sslまたは--disable-sslのかわりに--ssl-mode=DISABLEDを使用します。--ssl-verify-server-certオプションのかわりに--ssl-mode=VERIFY_IDENTITYを使用します。 (サーバー側の--sslオプションは変更されません。)C API の場合、 mysql_options()のMYSQL_OPT_SSL_ENFORCEおよびMYSQL_OPT_SSL_VERIFY_SERVER_CERTオプションはクライアント側の--sslおよび--ssl-verify-server-certオプションに対応し、削除されます。 かわりに、SSL_MODE_REQUIREDまたはSSL_MODE_VERIFY_IDENTITYのオプション値を指定してMYSQL_OPT_SSL_MODEを使用します。
- 
--temp-poolサーバーオプションが削除されました。
- 
ignore_builtin_innodbシステム変数が削除されます。
- 
サーバーは、特殊文字を含む pre-MySQL 5.1 データベース名を、 #mysql50#接頭辞が追加された 5.1 形式に変換しなくなりました。 これらの変換は実行されなくなったため、mysqlcheck の--fix-db-namesおよび--fix-table-namesオプション、ALTER DATABASEステートメントのUPGRADE DATA DIRECTORY NAME句およびCom_alter_db_upgradeステータス変数は削除されます。アップグレードは、あるメジャーバージョンから別のメジャーバージョン (5.0 から 5.1、5.1 から 5.5 など) へのアップグレードでのみサポートされるため、古い 5.0 データベース名を現在のバージョンの MySQL に変換する必要はほとんどありません。 回避策として、より新しいリリースにアップグレードする前に、MySQL 5.0 インストールを MySQL 5.1 にアップグレードします。 
- 
mysql_install_db プログラムが MySQL ディストリビューションから削除されました。 データディレクトリの初期化は、かわりに --initializeまたは--initialize-insecureオプションを指定して mysqld を起動することで実行する必要があります。 さらに、mysql_install_db で使用された mysqld の--bootstrapオプションが削除され、mysql_install_db のインストール場所を制御するINSTALL_SCRIPTDIRCMakeオプションが削除されました。
- 
汎用パーティション化ハンドラが MySQL サーバーから削除されました。 特定のテーブルのパーティション化をサポートするには、テーブルに使用されるストレージエンジンが独自の (「native」) パーティショニングハンドラを提供する必要があります。 --partitionおよび--skip-partitionオプションは MySQL Server から削除され、パーティション関連のエントリはSHOW PLUGINSの出力またはINFORMATION_SCHEMA.PLUGINSテーブルに表示されなくなります。現在、2 つの MySQL ストレージエンジンがネイティブのパーティショニングサポートを提供しています: InnoDBおよびNDB。 これらのうち、MySQL 8.0 でサポートされているのはInnoDBのみです。 他のストレージエンジンを使用して MySQL 8.0 でパーティションテーブルを作成しようとすると、失敗します。アップグレードの影響. InnoDB(MyISAMなど) 以外のストレージエンジンを使用した MySQL 5.7 以前から MySQL 8.0 へのパーティションテーブルの直接アップグレードはサポートされていません。 このようなテーブルを処理するには、次の 2 つのオプションがあります:- ALTER TABLE ... REMOVE PARTITIONINGを使用してテーブルのパーティション化を削除します。
- ALTER TABLE ... ENGINE=INNODBを使用して、テーブルに使用されるストレージエンジンを- InnoDBに変更します。
 サーバーを MySQL 8.0 にアップグレードする前に、パーティション化された InnoDB以外のテーブルごとに、前述の 2 つ以上の操作を実行する必要があります。 そうしないと、アップグレード後にそのようなテーブルを使用できません。パーティション化がサポートされていない記憶域エンジンを使用してパーティション化されたテーブルを作成するテーブル作成ステートメントがエラー ( ER_CHECK_NOT_IMPLEMENTED ) で失敗するようになりました。そのため、MySQL 8.0 にインポートする古いバージョンの MySQL から出力されたダンプファイル (mysqldump によって出力されたものなど) に記載された、パーティション化されたテーブルを作成するステートメントが、ネイティブパーティショニングハンドラを持たない MyISAMなどの記憶域エンジンを指定していないことを確認する必要があります。 これを行うには、次のいずれかを実行します:- InnoDB以外の- STORAGE ENGINEオプションの値を使用する- CREATE TABLEステートメントからパーティション化への参照を削除します。
- ストレージエンジンを - InnoDBとして指定するか、デフォルトで- InnoDBをテーブルストレージエンジンとして使用できるようにします。
 詳細は、セクション24.6.2「ストレージエンジンに関連するパーティショニング制限」を参照してください。 
- 
システム変数およびステータス変数の情報は、 INFORMATION_SCHEMAで管理されなくなりました。 これらのテーブルは削除されます:GLOBAL_VARIABLES,SESSION_VARIABLES,GLOBAL_STATUS,SESSION_STATUS。 かわりに、対応する「パフォーマンススキーマ」テーブルを使用してください。 セクション27.12.14「パフォーマンススキーマシステム変数テーブル」およびセクション27.12.15「パフォーマンススキーマのステータス変数のテーブル」を参照してください。 さらに、show_compatibility_56システム変数が削除されました。 これは、INFORMATION_SCHEMAテーブルのシステム変数およびステータス変数の情報が「パフォーマンススキーマ」テーブルに移動され、不要になった移行期間に使用されました。 これらのステータス変数は削除されます:Slave_heartbeat_period,Slave_last_heartbeat,Slave_received_heartbeats,Slave_retried_transactions,Slave_running。 提供される情報は、「パフォーマンススキーマ」のテーブルにあります。Migrating to Performance Schema System and Status Variable Tables を参照してください。
- 
パフォーマンススキーマ setup_timersテーブルは、performance_timersテーブルのTICK行と同様に削除されました。
- 
libmysqld埋込みサーバーライブラリが次とともに削除されます:- mysql_options()- MYSQL_OPT_GUESS_CONNECTION,- MYSQL_OPT_USE_EMBEDDED_CONNECTION,- MYSQL_OPT_USE_REMOTE_CONNECTIONおよび- MYSQL_SET_CLIENT_IPのオプション
- mysql_config - --libmysqld-libs、- --embedded-libsおよび- --embeddedのオプション
- CMake - WITH_EMBEDDED_SERVER、- WITH_EMBEDDED_SHARED_LIBRARYおよび- INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIRのオプション
- (ドキュメント化されていない)mysql - --server-argオプション
- mysqltest - --embedded-server、- --server-argおよび- --server-fileのオプション
- mysqltest_embedded および mysql_client_test_embedded のテストプログラム 
 
- 
mysql_plugin ユーティリティが削除されました。 代替方法には、 --plugin-loadまたは--plugin-load-addオプションを使用したサーバー起動時、またはINSTALL PLUGINステートメントを使用した実行時のプラグインのロードが含まれます。
- 
resolveip ユーティリティが削除されます。かわりに、nslookup、host または dig を使用できます。 
- 
resolve_stack_dump ユーティリティが削除されます。 正式な MySQL ビルドからのスタックトレースは常にシンボル化されるため、resolve_stack_dump を使用する必要はありません。 
- 
次のサーバーエラーコードは使用されておらず、削除されています。 これらのエラーのいずれかをテストするアプリケーションを更新する必要があります。 ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE ER_BINLOG_ROW_RBR_TO_SBR ER_BINLOG_ROW_WRONG_TABLE_DEF ER_CANT_ACTIVATE_LOG ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION ER_CANT_CREATE_FEDERATED_TABLE ER_CANT_CREATE_SROUTINE ER_CANT_DELETE_FILE ER_CANT_GET_WD ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF ER_CANT_SET_WD ER_CANT_WRITE_LOCK_LOG_TABLE ER_CREATE_DB_WITH_READ_LOCK ER_CYCLIC_REFERENCE ER_DB_DROP_DELETE ER_DELAYED_NOT_SUPPORTED ER_DIFF_GROUPS_PROC ER_DISK_FULL ER_DROP_DB_WITH_READ_LOCK ER_DROP_USER ER_DUMP_NOT_IMPLEMENTED ER_ERROR_DURING_CHECKPOINT ER_ERROR_ON_CLOSE ER_EVENTS_DB_ERROR ER_EVENT_CANNOT_DELETE ER_EVENT_CANT_ALTER ER_EVENT_COMPILE_ERROR ER_EVENT_DATA_TOO_LONG ER_EVENT_DROP_FAILED ER_EVENT_MODIFY_QUEUE_ERROR ER_EVENT_NEITHER_M_EXPR_NOR_M_AT ER_EVENT_OPEN_TABLE_FAILED ER_EVENT_STORE_FAILED ER_EXEC_STMT_WITH_OPEN_CURSOR ER_FAILED_ROUTINE_BREAK_BINLOG ER_FLUSH_MASTER_BINLOG_CLOSED ER_FORM_NOT_FOUND ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED ER_FRM_UNKNOWN_TYPE ER_GOT_SIGNAL ER_GRANT_PLUGIN_USER_EXISTS ER_GTID_MODE_REQUIRES_BINLOG ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST ER_HASHCHK ER_INDEX_REBUILD ER_INNODB_NO_FT_USES_PARSER ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR ER_LOAD_DATA_INVALID_COLUMN_UNUSED ER_LOGGING_PROHIBIT_CHANGING_OF ER_MALFORMED_DEFINER ER_MASTER_KEY_ROTATION_ERROR_BY_SE ER_NDB_CANT_SWITCH_BINLOG_FORMAT ER_NEVER_USED ER_NISAMCHK ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR ER_NO_FILE_MAPPING ER_NO_GROUP_FOR_PROC ER_NO_RAID_COMPILED ER_NO_SUCH_KEY_VALUE ER_NO_SUCH_PARTITION__UNUSED ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED ER_ORDER_WITH_PROC ER_PARTITION_SUBPARTITION_ERROR ER_PARTITION_SUBPART_MIX_ERROR ER_PART_STATE_ERROR ER_PASSWD_LENGTH ER_QUERY_ON_MASTER ER_RBR_NOT_AVAILABLE ER_SKIPPING_LOGGED_TRANSACTION ER_SLAVE_CHANNEL_DELETE ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT ER_SLAVE_MUST_STOP ER_SLAVE_WAS_NOT_RUNNING ER_SLAVE_WAS_RUNNING ER_SP_GOTO_IN_HNDLR ER_SP_PROC_TABLE_CORRUPT ER_SQL_MODE_NO_EFFECT ER_SR_INVALID_CREATION_CTX ER_TABLE_NEEDS_UPG_PART ER_TOO_MUCH_AUTO_TIMESTAMP_COLS ER_UNEXPECTED_EOF ER_UNION_TABLES_IN_DIFFERENT_DIR ER_UNSUPPORTED_BY_REPLICATION_THREAD ER_UNUSED1 ER_UNUSED2 ER_UNUSED3 ER_UNUSED4 ER_UNUSED5 ER_UNUSED6 ER_VIEW_SELECT_DERIVED_UNUSED ER_WRONG_MAGIC ER_WSAS_FAILED
- 
非推奨の INFORMATION_SCHEMAINNODB_LOCKSおよびINNODB_LOCK_WAITSテーブルは削除されます。 代わりに、パフォーマンススキーマdata_locksおよびdata_lock_waitsテーブルを使用してください。注記MySQL 5.7 では、 INNODB_LOCKSテーブルのLOCK_TABLEカラムとsysスキーマinnodb_lock_waitsおよびx$innodb_lock_waitsビューのlocked_tableカラムには、スキーマ/テーブル名の値が結合されています。 MySQL 8.0 では、data_locksテーブルおよびsysスキーマビューに個別のスキーマ名およびテーブル名のカラムが含まれます。 セクション28.4.3.9「innodb_lock_waits および x$innodb_lock_waits のビュー」を参照してください。
- 
InnoDBでは、圧縮一時テーブルはサポートされなくなりました。innodb_strict_modeが有効な場合 (デフォルト)、ROW_FORMAT=COMPRESSEDまたはKEY_BLOCK_SIZEが指定されていると、CREATE TEMPORARY TABLEはエラーを返します。innodb_strict_modeが無効な場合は、警告が発行され、圧縮されていない行形式を使用して一時テーブルが作成されます。
- 
InnoDBでは、MySQL データディレクトリ外にテーブルスペースデータファイルを作成する際に、.islファイル (InnoDBシンボリックリンクファイル) は作成されなくなりました。innodb_directoriesオプションでは、データディレクトリ外で作成されたテーブルスペースファイルの検索がサポートされるようになりました。この変更により、 .islファイルを手動で変更してサーバーがオフラインのときにリモートテーブルスペースを移動することはサポートされなくなりました。 リモートテーブルスペースファイルの移動は、innodb_directoriesオプションでサポートされるようになりました。 セクション15.6.3.6「サーバーがオフラインのときのテーブルスペースファイルの移動」を参照してください。
- 
次の InnoDBファイル形式変数が削除されました:MySQL 5.1 で以前のバージョンの InnoDBと互換性のあるテーブルを作成するには、ファイル形式変数が必要でした。 MySQL 5.1 が製品ライフサイクルの最後に到達したため、これらのオプションは不要になりました。FILE_FORMATカラムがINNODB_TABLESテーブルおよびINNODB_TABLESPACES「情報スキーマ」テーブルから削除されました。
- 
XA トランザクションでの双方向コミットのサポートを可能にする innodb_support_xaシステム変数が削除されました。 XA トランザクションでの双方向コミットのInnoDBサポートは、常に有効です。
- 
DTrace のサポートが削除されました。 
- 
JSON_APPEND()関数が削除されました。 かわりにJSON_ARRAY_APPEND()を使用してください。
- 
共有 InnoDBテーブルスペースへのテーブルパーティションの配置のサポートは、MySQL 8.0.13 で削除されました。 共有テーブルスペースには、InnoDBシステムテーブルスペースおよび一般テーブルスペースが含まれます。 共有テーブルスペースのパーティションの識別および file-per-table テーブルスペースへの移動の詳細は、セクション2.11.5「アップグレード用のインストールの準備」 を参照してください。
- 
SET以外のステートメントでのユーザー変数の設定のサポートは、MySQL 8.0.13 で非推奨になりました。 この機能は、MySQL 9.0 で削除されることがあります。
- 
--ndbperror オプションが削除されました。 かわりに ndb_perror ユーティリティを使用してください。
- 
innodb_undo_logs変数が削除されました。innodb_rollback_segments変数は同じ機能を実行するため、かわりに使用する必要があります。
- 
Innodb_available_undo_logsステータス変数が削除されました。 テーブルスペースごとに使用可能なロールバックセグメントの数は、SHOW VARIABLES LIKE 'innodb_rollback_segments';を使用して取得できます
- 
MySQL 8.0.14 では、以前に非推奨となった innodb_undo_tablespaces変数は構成できなくなりました。 詳細は、セクション15.6.3.4「undo テーブルスペース」を参照してください。
- 
ALTER TABLE ... UPGRADE PARTITIONINGステートメントのサポートは削除されました。
- 
MySQL 8.0.16 では、 internal_tmp_disk_storage_engineシステム変数のサポートが削除されました。ディスク上の内部一時テーブルでは、常にInnoDBストレージエンジンが使用されるようになりました。 詳細は、オンディスク内部一時テーブルのストレージエンジン を参照してください。
- 
DISABLE_SHAREDCMake オプションは未使用であり、削除されました。