MySQL は、スウェーデンの MySQL AB 社によって開発された、オープンソースの小規模リレーショナル データベース管理システムです。現在、MySQL はインターネット上の中小規模の Web サイトで広く使用されています。 MySQL は、サイズが小さく、速度が速く、総所有コストが低く、特にオープンソースの特性により、Web サイトの総所有コストを削減するために、多くの中小規模の Web サイトが Web サイト データベースとして MySQL を選択しています。
MySQL 開発チームは 12 日に MySQL 8.0.0 開発マイルストーン バージョン (DMR) のリリースを発表しました。 MySQL がなぜ 5.x から 8.0 に急上昇したのかに驚く人もいるかもしれません。実際、MySQL 5.x シリーズは Oracle による買収前は 5.1 であり、買収後は 5.5、5.6、5.7 などと 5.x が維持されてきました。実際、元のリリース リズムに従う場合、5.6.x は 6.x、5.7.x は 7.x と考えることができます。したがって、バージョンの命名方法を変更しただけです。
しかし、今回リリースされた MySQL 8.0.0 開発版にはまだ多くのハイライトがあります。
MySQL 8.0.0 のハイライト
トランザクション データ ディクショナリは MyISAM ストレージ エンジンから完全に分離されました
データ ディクショナリは実際に InnoDB の一部のテーブルに配置され、FRM、TRG、および PAR ファイルはもう必要ありません。情報スキーマがデータ ディクショナリ テーブルのビューとして表示されるようになりました。原則として、MyISAM データ テーブル タイプはまったく必要なく、すべてのシステム テーブルを InnoDB に配置できます。
SQL ロール
ロールは権限の集合です。ロールを作成したり、ユーザーにロールを付与したり削除したりできます。これは権限管理に便利です。
utf8mb4 文字セットがデフォルトの文字セットになり、Unicode 9 をサポートします
デフォルトの文字セットは latin1 から utf8mb4 に変更され、デフォルトの順序照合順序は latin1_swedish_ci から utf8mb4_800_ci_ai に変更されます。
非表示インデックス
一部のインデックスは、SQL オプティマイザーが使用しないように非表示に設定できますが、バックグラウンドで更新され続けます。必要に応じていつでも可視性を回復できます。
バイナリデータに対してビット演算を実行可能
BIGINTに対してビット演算を実行できるだけでなく、8.0からは[VAR]BINARY/[TINY|MEDIUM|LONG]BLOBに対するビット演算もサポートされています。
IPv6 と UUID の操作が改善されました
INET6_ATON() と INET6_NTOA() はビット操作を実行できるようになりました。これは、INET6_ATON() が VARBINARY(16) データ型 (128 ビット) を返すようになったためです。 UUID の操作が改善され、3 つの新しい関数 UUID_TO_BIN()、BIN_TO_UUID()、および IS_UUID() が導入されました。 MySQL には特別な IPv6 および UUID データ型はありませんが、VARBINARY(16) データ型で格納されます。
永続的なグローバル変数
SET PERSIST を使用して永続的なグローバル変数を設定できます。この変数は、サーバーが再起動されても維持されます。
パフォーマンス データベースのパフォーマンス スキーマの改善
たとえば、より高速な検索を可能にするために、100 を超えるインデックスがパフォーマンス データベースに追加されました。
SQL アナライザーをリファクタリングします
SQL アナライザーを継続的かつ段階的に改善します。古いパーサーには、構文の複雑さとトップダウン解析アプローチにより重大な制限があり、維持および拡張が困難でした。
コスト モデル
InnoDB バッファーは、メイン メモリ キャッシュにあるテーブルとインデックスの数を推定できるようになりました。これにより、アクセス方法を選択するときに、オプティマイザーがデータをメモリに保存できるか、ディスクに保存する必要があるかを認識できるようになります。
ヒストグラム
ヒストグラムを使用すると、ユーザーまたは DBA はデータ分布に関する統計を作成でき、これをクエリの最適化に使用して、最適化されたクエリ ソリューションを見つけることができます。
スキャン パフォーマンスの向上
InnoDB 範囲クエリのパフォーマンスが向上しました。これにより、フル テーブル クエリと範囲クエリのパフォーマンスが 5 ~ 20% 向上します。
BLOB の再構築
BLOB を再構築すると、フラグメントの読み取り/更新操作が高速化され、JSON データ操作が高速化されます。
永続的な自動インクリメント値
InnoDB は、自動インクリメント シーケンスの最大値を REDO ログに永続化します。この改善により、非常に古いバグ番号 199 も修正されました。
一時テーブル
圧縮された一時テーブルのサポートを削除し、一時テーブルのメタデータをメモリに保存します。
さらに重要な改善点と詳細については、MySQL 8.0.0 リリースのお知らせ [1] とこちら [2] を参照してください。
ダウンロード
現在、8.0.0 はまだ開発バージョンです。最新の機能を体験してテストしたい場合は、dev.mysql.com[3] から各プラットフォームのインストール パッケージをダウンロードできます。ただし、MySQL ソフトウェア パッケージはますます大きくなり、Linux プラットフォーム上のバイナリ パッケージは 1 GB 近くになります。運用環境で使用する場合は、8.0 が安定バージョンになる前に、5.7 シリーズを引き続き使用してください。最新バージョンは 5.7.15 GA バージョンであり、これはわずか 600 M を超えます。
最新のソース コードは GitHub にあります。興味のある方は、中国人からの投稿をご覧ください。
MySQL 8.0 以降、非表示インデックス機能、いわゆる非表示インデックスがサポートされています。非表示のインデックスの場合、オプティマイザは単にそれらを無視します。この機能を通じて、オプティマイザーの動作に影響を与えることができます。また、これはインデックスを削除する前のバッファとみなすこともできます。インデックスを一時的に非表示に設定した後、アプリケーションが正常であるか、エラーなどが発生していないかを観察し、問題がなければ最終的に削除します。 。
8.0.0 の対応するリリースノート:
Test
# 创建一个普通的表t1,只带主键 mysql> create table t1 (a int primary key auto_increment, b int, c int, d int); Query OK, 0 rows affected (0.67 sec) # 增加一个索引 mysql> alter table t1 add key(b); Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show indexes from t1\G *************************** 1. row *************************** Table: t1 Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: a Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: Visible: YES *************************** 2. row *************************** Table: t1 Non_unique: 1 Key_name: b Seq_in_index: 1 Column_name: b Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: YES 2 rows in set (0.01 sec) 从show indexes的visible列显示了,这两个索引都是可见的。 # Load some data insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000; insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000 from t1; insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000 from t1; .... analyze table t1; mysql> explain select * from t1 where b > 5000 limit 10; +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ | 1 | SIMPLE | t1 | NULL | range | b | b | 5 | NULL | 1932 | 100.00| Using index condition | +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ 1 row in set, 1 warning (0.00 sec 可以看到索引b被使用到 # 修改索引b为不可见 mysql> alter table t1 alter index b invisible; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show indexes from t1\G *************************** 1. row *************************** Table: t1 Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: a Collation: A Cardinality: 2048 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: Visible: YES *************************** 2. row *************************** Table: t1 Non_unique: 1 Key_name: b Seq_in_index: 1 Column_name: b Collation: A Cardinality: 2029 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: NO 2 rows in set (0.01 sec) mysql> explain select * from t1 where b > 5000 limit 10\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 2048 filtered: 33.33 Extra: Using where 1 row in set, 1 warning (0.00 sec) 当索引被修改为invisible后,优化器将不再选择这个索引 # 将索引重新修改为可见 mysql> alter table t1 alter index b visible; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> explain select * from t1 where b > 5000 limit 10\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: range possible_keys: b key: b key_len: 5 ref: NULL rows: 1932 filtered: 100.00 Extra: Using index condition 1 row in set, 1 warning (0.00 sec) # 你也可以在创建索引的时候显式指定是否可见 mysql> alter table t1 add key(c) invisible; Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show indexes from t1 where key_name = 'c'\G *************************** 1. row *************************** Table: t1 Non_unique: 1 Key_name: c Seq_in_index: 1 Column_name: c Collation: A Cardinality: 1848 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: NO 1 row in set (0.01 sec) # 或者在建表时指定关键字 mysql> create table t2 (a int primary key, b int, key(b) invisible); Query OK, 0 rows affected (0.67 sec) # 但primary key不可以设置为不可见 mysql> drop table t2; Query OK, 0 rows affected (0.03 sec) mysql> create table t2 (a int, b int, primary key(a) invisible); ERROR 3522 (HY000): A primary key index cannot be invisible