MySQL8.0(Development Milestone Release)を試す

2017.08.23

こんにちは。YDCのさだおです。
MySQL 5.7 の次期バージョンである MySQL 8.0の開発途上版(DMR)がリリースされました。
MySQL 8.0.2を RHEL にインストールしてみましたのでご紹介します。

インストール

1. MySQLのページから次のRPMパッケージをダウンロード

  • mysql-common-8.0.2.0.1
  • mysql-community-libs-compat-8.0.2.0.1
  • mysql-community-libs-8.0.2.0.1
  • mysql-community-devel-8.0.2.0.1
  • mysql-community-client-8.0.2.0.1
  • mysql-community-server-8.0.2.0.1

以下からダウンロード可能です。
https://dev.mysql.com/downloads/mysql/8.0.html

2. ダウンロードしたRPMパッケージを rpm -iコマンドでインストール

3. mysqlを開始

# /etc/init.d/mysqld start
mysqld を起動中: [ OK ]

4. パスワードを確認

# cat /var/log/mysqld.log | grep 'password'
2017-08-10T01:48:42.092072Z 5 [Note] A temporary password is generated for root@localhost: MOrkpXLf-6pn ★パスワードは MOrkpXLf-6pn

5. ログインしてバージョンを確認

# mysql -u root -p
Enter password:
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.2-dmr |
+-----------+
1 row in set (0.00 sec)

問題なくインストールできたようです。

確認してみる(1):.frmファイルの有無

MySQL 8.0 での大きな変更点は、.frmファイルが無くなったこと。
今までは、.frmファイルにテーブルに関するそのデータディクショナリ情報が格納されていました。
データディクショナリ情報は InnoDB に格納されるようです。

実際にテーブルを作って、.frmファイルが作成されないのか確認してみました。

mysql> create table order_tbl(order_no int,name varchar(20)); ★innodbで作成
Query OK, 0 rows affected (0.11 sec)

mysql> create table emp(id int,name varchar(20)) engine=MyISAM; ★MyISAMで作成
Query OK, 0 rows affected (0.01 sec)

mysql> quit
Bye

# ls | grep order_tbl ★innodbのテーブル
#
# ls | grep emp ★MyISAMのテーブル
emp.MYD
emp.MYI
emp_328.sdi

確かに、.FRM ファイルがありませんね。
しかも、.sdi ファイルが作られています。
.sdi ファイルについて調べてみると、リカバリや import/export を行う際に使う情報が格納されているようです。
また、innodb では .idb ファイル内に情報を持つため、.sdi ファイルは生成されないみたいです。

詳細は以下を参照してください。
http://mysqlserverteam.com/mysql-8-0-data-dictionary-architecture-and-design/

ちなみに今までのバージョンでは、下記のような結果になります。

# ls | grep order_tbl ★innodbのテーブル
order_tbl.FRM

# ls | grep emp ★MyISAMのテーブル
emp.FRM
emp.MYD
emp.MYI

確認してみる(2):invisible index

MySQL 8.0でオプティマイザからインデックスを隠す機能が追加されました。
多数インデックスが存在しているため使わていないと思われるインデックスを削除したい、
でも本当にqueryに影響がないのか...とても不安
そういったときにインデックスを invisible に設定し
オプティマイザから見えないようにして、query の動作を確認するときに利用できます。

例えば、item表を参照するSELECT文があります。
下のEXPLAINの結果から、index_itemという名前のインデックスが使用されていることが分かります。

mysql> explain select * from item where id='85000';
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | item | NULL | ref | index_item | index_item | 4 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)

では、index_itemをinvisibleにします。

mysql> alter table item alter index index_item invisible;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0

invisibleにした結果、索引は使われなくなってしまいました。

mysql> explain select * from item where id='85000';
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | item | NULL | ALL | NULL | NULL | NULL | NULL | 521671 | 10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

最後に

MySQL8.0ではその他にも様々な機能強化が行われていて、さらに開発途中の機能もあるようです。
どのように進化するのか楽しみですね。

Standby Expressに関するお問合わせ

  • TEL 042-333-6217
  • FAX 042-352-6101
  • LINE
  • Mail