MySQL5.show databases構文を実行すると、
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
このsysスキーマはPerformance Schemaの情報を一目で理解できるように変更したビューを提供したり、Performance Schemaの設定を変更するストアドプロシージャやストアドファンクションなどを提供します。
今回は、
table_exists() プロシージャ
指定したテーブルが通常のテーブル、
testデータベースにt0テーブルが存在するか実行してみます。
mysql > CALL sys.table_exists('test','t0',@output);
Query OK, 0 rows affected (0.04 sec)
mysql > SELECT @output;
+------------+
| @output |
+------------+
| BASE TABLE |
+------------+
1 row in set (0.00 sec)
ビューの場合は以下のようになります。
mysql > CALL sys.table_exists('test','t0_view',@output);
Query OK, 0 rows affected (0.00 sec)
mysql > SELECT @output;
+---------+
| @output |
+---------+
| VIEW |
+---------+
戻り値として、
- '' : テーブルやビューが存在していない場合は空の値が返ります
- 'BASE TABLE' : 通常のテーブルが存在していることを表します
- 'VIEW' : ビューが存在していることを表します
- 'TEMPORARY' : テンポラリーテーブルが存在していることを表します
create_synonym_db() プロシージャ
スキーマ名を指定すると、information_やperformance_といった長い名称のスキーマを毎回、
このプロシージャーを使用して短い名称のシノニムスキーマを作成することで、use構文やシノニムスキーマ名.テーブル名でアクセスできるようになります。
引数に基のスキーマとシノニムスキーマを指定します。
information_のシノニムスキーマI_を作成する例
mysql > CALL sys.create_synonym_db('INFORMATION_SCHEMA', 'I_S');
+----------------------------------------+
| summary |
+----------------------------------------+
| Created 61 views in the `I_S` database |
+----------------------------------------+
mysql > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| I_S |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
mysql > use I_S;
Database changed
mysql > show tables like 'TABLES';
+------------------------+
| Tables_in_I_S (TABLES) |
+------------------------+
| TABLES |
+------------------------+
execute_prepared_stmt() プロシージャ
引数にSQL文を指定することで、
mysql > CALL sys.execute_prepared_stmt('SELECT * FROM sys.version');
+-------------+---------------+
| sys_version | mysql_version |
+-------------+---------------+
| 1.5.1 | 5.7.23 |
+-------------+---------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
statement_performance_analyzer() プロシージャ
実行中のMySQL上のステートメント情報のレポートを作成します。こちらについては次回詳しく紹介いたします。
quote_identifier() ファンクション
テーブル名やスキーマ名等で使用したい文字列を引数で指定すると、
mysql > SELECT sys.quote_identifier('test`test');
+-----------------------------------+
| sys.quote_identifier('test`test') |
+-----------------------------------+
| `test``test` |
+-----------------------------------+
mysql > SELECT sys.quote_identifier('select');
+--------------------------------+
| sys.quote_identifier('select') |
+--------------------------------+
| `select` |
+--------------------------------+
list_add()/list_drop() ファンクション
カンマで区切られた値のリストに対して追加や削除をすることができます。たとえば、sql_オプションは、sql_からあるモードを追加や削除する際には、
第1引数にリストの値、
以下は、sql_に登録されたONLY_のみを削除する例です。list_
mysql > SELECT @@sql_mode; +-------------------------------------------+ | @@sql_mode | +-------------------------------------------+ | ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION | +-------------------------------------------+ mysql > SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY'); Query OK, 0 rows affected (0.00 sec) mysql > SELECT @@sql_mode; +------------------------+ | @@sql_mode | +------------------------+ | NO_ENGINE_SUBSTITUTION | +------------------------+
追加する場合は、sql_に対して、ERROR_とNO_を追加してみます。
mysql > SELECT @@sql_mode; +------------------------+ | @@sql_mode | +------------------------+ | NO_ENGINE_SUBSTITUTION | +------------------------+ 1 row in set (0.00 sec) mysql > SET @@sql_mode = sys.list_add(@@sql_mode, 'ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_IN_DATE'); Query OK, 0 rows affected, 1 warning (0.00 sec) mysql > SELECT @@sql_mode; +-------------------------------------------------------------------+ | @@sql_mode | +-------------------------------------------------------------------+ | NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +-------------------------------------------------------------------+ 1 row in set (0.00 sec)
また、
例として、bを削除してみます。
mysql > SELECT * FROM test_set; +---------+ | set_val | +---------+ | b | | b,c | | a,b,c | +---------+ 3 rows in set (0.00 sec) mysql > UPDATE test_set SET set_val=sys.list_drop(set_val,'b'); Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql > SELECT * FROM test_set; +---------+ | set_val | +---------+ | | | c | | a,c | +---------+ 3 rows in set (0.00 sec)
まとめ
sysスキーマには運用や分析を便利にしてくれる機能があります。今回説明したもの以外にも、
また、SHOW PROCEDURE STATUS LIKE 'procedure_、SHOW FUNCTION STATUS LIKE 'function_で確認することも可能です。
次回は、