基礎MySQL  ~その３~ アーキテクチャ

# アーキテクチャ
アーキテクチャ概要図
![mysql_arc.jpg](https://qiita-image-store.s3.amazonaws.com/0/17852/04d7a7e9-8771-4e82-a5db-8ba2bdcfe862.jpeg)
参考:[Storage Engine Architecture](http://www.oracle.com/technetwork/articles/javase/index-141965.html)

SQLクエリ実行時の流れ

|順番|名称|役割|
|:--|---|----|
|1|Connectors|クライアントから接続、SQLクエリの発行|
|2|Connection Pool|接続の受け付け|
|3|SQL Interface|SQLクエリの受け付け|
|4|Parser|SQLクエリの構文解析|
|5|Optimaizer|SQLクエリの**実行計画**の作成（どのIndexを使うか、JOINをどう行うかなど）|
|6|Pluggable Storage Engine|ストレージエンジンでメモリ、ファイルからデータ取得、更新<br>ストレージエンジンは複数あり変更が可能|
|7|File System|OSファイルシステムでファイルから読み取り、保存|

# ストレージエンジン
MySQLの特徴の一つ
複数のストレージエンジンをテーブル毎に切り替えて使用することもできる。
MySQL5.5以降**InnoDB**がデフォルトのストレージエンジン
[MySQL ストレージエンジンアーキテクチャーの概要](https://dev.mysql.com/doc/refman/5.6/ja/pluggable-storage-overview.html)

## ストレージエンジンでやっていること

 * テーブル定義と物理ファイルの関連付け  
   テーブル、インデックスをどのようなファイル構成、ファイルフォーマットで持つか
 * 独自のインデックス実装  
   ex)日本語全文検索
 * 独自のキャッシュ機能  
   ex)innodb_buffer_pool_size(InnoDBのデータキャッシュ)
 * トランザクション機能  
 * 外部キー機能

など

InnoDBはトランザクション機能など他のDBと似た機能を持つ。
MyISAMではトランザクション機能がない。
BLACKHOLEでは実際にデータを書きこまない。
など、それぞれストレージエンジンの特徴があり、
アプリケーション要件に合わせテーブル毎に変更が可能。

MySQLインストール時に使用可能なストレージエンジンは以下

```mysql:query
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
```
[代替ストレージエンジン](https://dev.mysql.com/doc/refman/5.6/ja/storage-engines.html)

## その他ストレージエンジン
MySQL公式以外にもストレージエンジンがリリースされている。

[mroonga](http://mroonga.org/ja/) 日本語全文検索
[Spider](http://spiderformysql.com/) シャーディング

mroongaやSpiderはMariaDBにバンドルされてたりするので、
使いたい場合はMariaDBを使ってもよいのかも
[MariaDB ストレージエンジン](https://mariadb.com/kb/en/mariadb/storage-engines/)
※[MariaDB](https://mariadb.org/)はMySQLのfork?のDBでほぼMySQLと同じように使えます。

## ストレージエンジンの設定

テーブル作成時に明示的に指定

```mysql:query
CREATE TABLE test_table (id int) ENGINE = InnoDB;
```

ストレージエンジンの変更

```mysql:query
ALTER TABLE test_table ENGINE = MyISAM;
```

ストレージエンジンの確認

```mysql:query
SHOW CREATE TABLE test_table;
```
```mysql:query
SHOW TABLE STATUS LIKE 'test_table';
```
```mysql:query
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE 
FROM information_schema.tables
WHERE TABLE_NAME = 'test_table';
```


# 参考
[MySQL事始　ストレージエンジン(1) アーキテクチャ概要](http://enterprisezine.jp/dbonline/detail/3711)