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_
で確認することも可能です。
次回は、