ホームページ  >  記事  >  データベース  >  mysql8.0が来ます

mysql8.0が来ます

伊谢尔伦
伊谢尔伦オリジナル
2017-02-07 16:33:255015ブラウズ

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 と考えることができます。したがって、バージョンの命名方法を変更しただけです。

mysql8.0が来ます

しかし、今回リリースされた 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 の対応するリリースノート:

mysql8.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


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。