MariaDB 10.1 GAまとめ

2015/10/17に[GA](https://blog.mariadb.org/mariadb-10-1-is-stable-ga/)になったMariaDB 10.1.8のまとめです。
参考までに本家のドキュメントへのリンクも貼っています。

足りないところなど補足していただけると助かります。

# Security
## [Data at Rest Encryption](https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/)
10.1.3及び10.1.4から利用可能な機能です。
簡単にいえばデータ暗号化の機能で、XtraDB/InnoDB及びAriaストレージエンジンに対応しています。
暗号化の範囲は個別のテーブル及びXtraDB/InnoDBのログファイルとなっています。
暗号化の復号にかかるオーバーヘッドは大体3〜5%とのこと。

## [Password Validation](https://mariadb.com/kb/en/mariadb/password-validation/)
10.1.2から利用可能な機能です。
ユーザーのパスワードに対して、例えば「大文字の英字を1文字以上含む」と言った規約を設定することが出来ます。

プラグインをインストール(INSTALL PLUGIN)することによりポリシーを設定することが可能です。
現在サポートされているのは以下の2種類です。

 * simple_password_check
 * cracklib_password_check

設定したパスワードのポリシーは、次回以降の設定から適用されます。

# HA
## [Galera support](https://blog.mariadb.org/mariadb-10-1-1-galera-support/)
10.1.1から、[Galera](http://galeracluster.com/)が同梱されるようになりました。
10.1のパッケージは、MariaDB単体か、またはGaleraのノードとして利用することが可能になります。
ソースからビルドする際は、ビルドオプションの`WITH_WSREP`を`ON`にしておく必要があります。

## [Optimistic mode of in-order parallel replication](https://mariadb.com/kb/en/mariadb/parallel-replication/#optimistic-mode-of-in-order-parallel-replication)
10.1.3からparallel replicationにOptimistic modeが追加されました。
このモードがONの状態では、DDL同士が同じ行を変更するなどで起こるコンフリクトを楽観的に解決するようになります。

例えばトランザクションA, Bがコンフリクトした場合、後者のトランザクションがロールバックされ、前者のトランザクションを適用します。変更が適用されたら、その後再度後者を適用します。

これによってトランザクションのロールバックが起こりますが、基本的にはこのロールバックのコストより並列でbinlogを適用する事によるコスト削減のメリットのほうが大きくなるようです。


## GTID対応
GTIDに対応することで、GTIDが有効化されているMySQL5.6、またはそれ以上のバージョンのslaveとなることが可能になりました。
MySQLとMariaDBを混在させるパターンや、MySQLからMariaDBにマイグレーションする場合に重要な機能ですね。

# Scalability
## パフォーマンス改善
[MariaDB 10.1 can do 1 million queries per second](https://blog.mariadb.org/10-1-mio-qps/)
状況によるので、この辺りはまた別途ベンチマークを取ってみたいですね。

## [Defragmentation](https://mariadb.com/kb/en/mariadb/defragmenting-innodb-tablespaces/)
`innodb-defragment=1`を設定することで、`OPTIMIZE TABLE`で新しいテーブルの作成をせずにデフラグを行うことができるようになりました。


# Information Schema
wsrep (write set replication)向けのテーブルが2つ、GIS(地理情報)向けのテーブルが2つ追加されました。

* [WSREP_MEMBERSHIP](https://mariadb.com/kb/en/mariadb/information-schema-wsrep_membership-table/)
* [WSREP_STATUS](https://mariadb.com/kb/en/mariadb/information-schema-wsrep_status-table/)
* [GEOMETRY_COLUMNS](https://mariadb.com/kb/en/information-schema-geometry_columns-table/)
* [SPATIAL_REF_SYS](https://mariadb.com/kb/en/information-schema-spatial_ref_sys-table/)

また、以下のテーブルにカラムが追加されました

* [APPLICABLE_ROLES(IS_DEFAULT)](https://mariadb.com/kb/en/mariadb/information-schema-applicable_roles-table/)
* [VIEWS(ALGORITHM)](https://mariadb.com/kb/en/mariadb/information-schema-views-table/)

# GIS
10.1.2から、地理情報向けの標準関数が増えました。

* [ST_BOUNDARY()](https://mariadb.com/kb/en/mariadb/st_boundary/)
* [ST_CONVEXHULL()](https://mariadb.com/kb/en/mariadb/st_convexhull/)
* [ST_ISRING()](https://mariadb.com/kb/en/mariadb/st_isring/)
* [ST_POINTONSURFACE()](https://mariadb.com/kb/en/mariadb/st_pointonsurface/)
* [ST_RELATE()](https://mariadb.com/kb/en/mariadb/st_relate/)


# Syntax
## Consistent IF [NOT] EXISTS/OR REPLACE Support
いくつかのDDLに対して、`IF [NOT] EXISTS`,`OR REPLACE`が利用可能になります。

 * CREATE DATABASE
 * CREATE EVENT
 * CREATE FUNCTION UDF
 * CREATE INDEX
 * CREATE ROLE
 * CREATE SERVER 
 * CREATE TRIGGER
 * CREATE USER
 * CREATE VIEW
 * DROP EVENT
 * DROP INDEX
 * DROP ROLE 
 * DROP TRIGGER 
 * DROP USER 

## [SHOW/FLUSH Syntax](https://mariadb.com/kb/en/information-schema-plugins-show-and-flush-statements/)
information_schemaのテーブルに対してSHOW/FLUSH文が利用可能になりました。
SHOW文を利用すると、複数のカラムが存在しても古き良き80x25のサイズに合わせて省略してくれるそうです。

## ANALYZE/EXPLAIN
[ANALYZE](https://mariadb.com/kb/en/mariadb/analyze-statement/)及び`ANALYZE FORMAT=JSON`がEXPLAINと同等のフォーマットで結果を返すようになりました。
[EXPLAIN FORMAT=JSON](https://mariadb.com/kb/en/mariadb/explain/)がMySQL5.6に合わせて再実装されました。

## [GET_LOCK(str,timeout)](https://mariadb.com/kb/en/mariadb/get_lock/)
[GET_LOCK(str,timeout)](https://mariadb.com/kb/en/mariadb/get_lock/)の第二引数であるtimeoutにマイクロ秒を指定することが可能になりました。

# オプティマイザ
## [ORDER BY](https://mariadb.com/kb/en/mariadb/improvements-to-order-by/)
`ORDER BY`の挙動が変わったそうです。
ドキュメントへもある通り深く追えなかったので、あまり説明できません。

## frm
.frmファイルがtemporary tableに対して作成されなくなります

## [MAX_STATEMENT_TIME](https://mariadb.com/kb/en/mariadb/aborting-statements/)
max_statement_timeを1以上の値にすると、指定秒数を超えたクエリの実行は自動的に中止されるようになります。

## UNION ALL
UNION ALLの実行にtemporary tableが利用されなくなりました。
この変更はMySQL5.7にバックポートされるそうです。

## malloc()の実行タイミングの変更
`malloc()`の実行タイミングを変えたことで、簡単なクエリの実行が早くなったそうです。

## WebscaleSQLのパッチ適用
幾つかの[WebscaleSQL](https://github.com/webscalesql)のパッチが適用されたそうです。

# XtraDB/InnoDB
## ページサイズの上限が64KBに
MySQL5.7と同様に、`innodb_page_size`に対して`32k`と`64k`が指定できるようになります。


# その他
## Slow log
Slow Query Log(及びmysql.slow_log)にUPDATE/DELETE文が記載されるとき、変更のあった行数を表示するようになった。

## [Primary Key](https://mariadb.com/kb/en/mariadb/primary-keys-with-nullable-columns/)
PRIMARY KEYに指定されていて、かつDEFAULT NULLが指定されているカラムは自動的にNOT NULL DEFAULT 0に変換されるようになった。


# インストール
パッケージマネージャからインストールすることが出来ます。
[公式](https://downloads.mariadb.org/mariadb/repositories/)からインストールのための設定を自動生成できるので、試してみてください。
設定例を記載しておきます。

```/etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/rhel6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

```bash
$ yum install mariadb mariadb-server
```

baseurlが10.1になっていることを確認してください。


# 参考

* https://blog.mariadb.org/mariadb-10-1-is-stable-ga/
* https://blog.mariadb.org/10-1-mio-qps/
* https://mariadb.com/kb/en/mariadb/what-is-mariadb-101/