SYSスキーマの説明をする機会があったので、改めてMySQL5.7.21でSYSスキーマに関しての概要をまとめたのでご紹介。
Performance_Schema, Information_Schemaを直接確認しないと取得出来無い情報もまだあるけれど、SYSスキーマを利用すれば簡単にMySQLの状態を確認出来、複雑なクエリーを使わないでもロックの状態、メモリーの状態、未使用のインデックス、起動してからの累積値だけれども遅いクエリー等が確認可能です。まだまだ使われていないユーザーも多いけど、便利なので是非活用下さい。

MySQL5.7.21の時点では以下のオブジェクトが存在します。


root@localhost [sys]> select * from schema_object_overview where db = 'sys';
+-----+---------------+-------+
| db  | object_type   | count |
+-----+---------------+-------+
| sys | TRIGGER       |     2 |
| sys | FUNCTION      |    22 |
| sys | PROCEDURE     |    26 |
| sys | VIEW          |   100 |
| sys | BASE TABLE    |     1 |
| sys | INDEX (BTREE) |     1 |
+-----+---------------+-------+
6 rows in set (0.32 sec)

以下のスライドにまとめたので、詳細をご確認下さい。


5.7.6 DMRではutf8mb4でのFTインデックスの作成が出来ませんでしたが、
5.7.7 RCで以下のバグ修正が行われたので、基本的なmecab設定をMySQL5.7.7RCにて確認。
今回のリリースで、5.7はRC(リリースキャンディデート)になったので、次のバージョンでGAになり色々な用途で使えるようになりそうです。

Changes in MySQL 5.7.7 (2015-04-08, Release Candidate)
InnoDB: The InnoDB MeCab full-text parser plugin now supports the eucjpms,
cp932, and utf8mb4 character sets. (Bug #20534096)

直接関係ないですが、5.7.7からはInnoDBのDefaultファイルフォーマットがBarracudaに変更されています。
Tableデータの圧縮を使う方には、手間が省けて良い変更かと思います。
http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-7.html
The innodb_file_format default value was changed to Barracuda.
The previous default value was Antelope. This change allows tables to use Compressed or Dynamic row formats.
bara

root@localhost [mecab]> select @@version;
+--------------+
| @@version    |
+--------------+
| 5.7.7-rc-log |
+--------------+
1 row in set (0.00 sec)

root@localhost [mecab]> select PLUGIN_NAME,PLUGIN_VERSION,PLUGIN_LICENSE from information_schema.plugins where PLUGIN_NAME IN ('ngram','mecab');
+-------------+----------------+----------------+
| PLUGIN_NAME | PLUGIN_VERSION | PLUGIN_LICENSE |
+-------------+----------------+----------------+
| ngram       | 0.1            | GPL            |
| mecab       | 0.1            | GPL            |
+-------------+----------------+----------------+
2 rows in set (0.00 sec)

root@localhost [mecab]> 

root@localhost [mecab]> CREATE TABLE M_DEMO_MB4
    -> (
    -> FTS_M_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    -> title VARCHAR(100),
    -> FULLTEXT INDEX mecab_idx(title) WITH PARSER mecab
    -> ) Engine=InnoDB CHARACTER SET utf8mb4;
Query OK, 0 rows affected (0.03 sec)

root@localhost [mecab]> 

table

テストデータを入れて、全文検索の基本動作が問題無い事を確認。

root@localhost [mecab]> INSERT INTO M_DEMO_MB4 (title) VALUES ('東京都は日本の首都です'),('京都と大阪は日本の府です');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@localhost [mecab]> INSERT INTO M_DEMO_MB4 (title) VALUES ('mysql');
Query OK, 1 row affected (0.01 sec)

root@localhost [mecab]> INSERT INTO M_DEMO_MB4 (title) VALUES ('MYSQL');
Query OK, 1 row affected (0.00 sec)

root@localhost [mecab]> INSERT INTO M_DEMO_MB4 (title) VALUES ('MySQL');
Query OK, 1 row affected (0.00 sec)

root@localhost [mecab]> INSERT INTO M_DEMO_MB4 (title) VALUES ('マイエスキューエル');
Query OK, 1 row affected (0.00 sec)

root@localhost [mecab]> INSERT INTO M_DEMO_MB4 (title) VALUES ('マイエスキューエル');
Query OK, 1 row affected (0.00 sec)

root@localhost [mecab]> INSERT INTO M_DEMO_MB4 (title) VALUES ('まいえすきゅーえる');
Query OK, 1 row affected (0.00 sec)

root@localhost [mecab]> 
root@localhost [mecab]> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position;
Empty set (0.01 sec)

root@localhost [mecab]> SET GLOBAL innodb_ft_aux_table="mecab/M_DEMO_MB4";
Query OK, 0 rows affected (0.00 sec)

root@localhost [mecab]> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position;
+-----------------------------+--------------+-------------+-----------+--------+----------+
| WORD                        | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
+-----------------------------+--------------+-------------+-----------+--------+----------+
| 東京                        |            2 |           2 |         1 |      2 |        0 |
| 日本                        |            2 |           3 |         2 |      2 |       12 |
| 首都                        |            2 |           2 |         1 |      2 |       21 |
| です                        |            2 |           3 |         2 |      2 |       27 |
| 京都                        |            3 |           3 |         1 |      3 |        0 |
| 大阪                        |            3 |           3 |         1 |      3 |        9 |
| 日本                        |            2 |           3 |         2 |      3 |       18 |
| です                        |            2 |           3 |         2 |      3 |       30 |
| mysql                       |            4 |           6 |         3 |      4 |        0 |
| mysql                       |            4 |           6 |         3 |      5 |        0 |
| mysql                       |            4 |           6 |         3 |      6 |        0 |
| マイエスキューエル          |            7 |           7 |         1 |      7 |        0 |
| マイエスキューエル                   |            8 |           8 |         1 |      8 |        0 |
| いえ                        |            9 |           9 |         1 |      9 |        3 |
| すき                        |            9 |           9 |         1 |      9 |        9 |
| える                        |            9 |           9 |         1 |      9 |       21 |
+-----------------------------+--------------+-------------+-----------+--------+----------+
16 rows in set (0.00 sec)

root@localhost [mecab]> SELECT FTS_M_ID,title,MATCH (title) AGAINST('日本の首都' IN NATURAL LANGUAGE MODE) AS score FROM M_DEMO_MB4;
+----------+--------------------------------------+--------------------+
| FTS_M_ID | title                                | score              |
+----------+--------------------------------------+--------------------+
|        1 | 東京都は日本の首都です               |  1.178047776222229 |
|        2 | 京都と大阪は日本の府です             | 0.3624762296676636 |
|        3 | mysql                                |                  0 |
|        4 | MYSQL                                |                  0 |
|        5 | MySQL                                |                  0 |
|        6 | マイエスキューエル                   |                  0 |
|        7 | マイエスキューエル                            |                  0 |
|        8 | まいえすきゅーえる                   |                  0 |
+----------+--------------------------------------+--------------------+
8 rows in set (0.00 sec)

root@localhost [mecab]> SELECT FTS_M_ID,title,MATCH (title) AGAINST('日本の首都' IN BOOLEAN MODE) AS score FROM M_DEMO_MB4;
+----------+--------------------------------------+-------------------+
| FTS_M_ID | title                                | score             |
+----------+--------------------------------------+-------------------+
|        1 | 東京都は日本の首都です               | 1.178047776222229 |
|        2 | 京都と大阪は日本の府です             |                 0 |
|        3 | mysql                                |                 0 |
|        4 | MYSQL                                |                 0 |
|        5 | MySQL                                |                 0 |
|        6 | マイエスキューエル                   |                 0 |
|        7 | マイエスキューエル                            |                 0 |
|        8 | まいえすきゅーえる                   |                 0 |
+----------+--------------------------------------+-------------------+
8 rows in set (0.00 sec)

root@localhost [mecab]> 


ViewとTableで同じデータを持ったオブジェクトを作成する事が出来るが、
それぞれメリットデメリットがある。Viewは常に最新のデータが反映されるという
メリットがあるが、毎回計算が入るので速度が遅い。Tableに関しては、速度は速いが
最新のデータが常に反映されない。用途にもよるので、それぞれ最適な方法を
選択する必要がある。最適なのは、テーブルのデータが常に最新のデータで反映
される事だが、Viewを必要とする時は対外テーブルが分散されている場合が多い…

以下のテーブルとビューは同じ結果を抽出することが出来る。

CREATE VIEW V_Surface
(Name, ContinentSurface, CountryAvgSurface)
AS SELECT Continent, SUM(SurfaceArea),
AVG(SurfaceArea)
FROM Country GROUP BY Continent;


CREATE TABLE T_Surface
AS SELECT Continent AS Name,
SUM(SurfaceArea) AS ContinentSurface,
AVG(SurfaceArea) AS CountryAvgSurface
FROM Country GROUP BY Continent;

table_vs_view


MySQL はMyISAM とMEMORY テーブルにはテーブルレベルロック
を使用し、InnoDBテーブルには行レベルロックを使用します。
Table_locks_waitedおよびTable_locks_immediateステータス変数を
チェックすることでシステム上でテーブルロック競合を分析できます。

mysql> SHOW STATUS LIKE ‘Table%’;
+———————–+——-+
| Variable_name | Value |
+———————–+——-+
| Table_locks_immediate | 19 |
| Table_locks_waited | 0 |
+———————–+——-+
2 rows in set (0.01 sec)

mysql>

InnoDBは行ロックを使用する。InnoDBでは、SQLステートメントの
トランザクションの初めではなく、プロセス中に自動的に入手するため、
デッドロックが可能です。

行レベルロックの利点
* 多数のスレッドで異なる行をアクセスする際に、ロックコンフリクトが少なくてすみます。
* ロールバックの変更がすくなくてすみます。
*1つの行を長時間ロックすることが可能です。

http://dev.mysql.com/doc/refman/5.1/ja/internal-locking.html