SQLのパフォーマンスチューニングをしている際などに、
今回はそういった場合に便利な、
Query Rewrite Pluginsを使ってみる
インストールして確認する
Query Rewrite Pluginsを有効にするためには、
まずは、
$ cd /usr/local/Cellar/mysql/8.0.27/share/mysql $ ls | grep rewriter install_rewriter.sql uninstall_rewriter.sql
install用のスクリプトとuninstall用のスクリプトが存在していることがわかります。
ではinstallをしてみましょう。
$ mysql -uroot < install_rewriter.sql
以上のコマンドを実行します。終わったらMySQLにログインして確認してみましょう。
mysql> SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | rewriter_enabled | ON | +------------------+-------+ 1 row in set (0.00 sec)
以上の形になっていたら、
もし、ERROR 1123 (HY000): Can't initialize function 'load_
というエラーが発生して先に進めなかった場合は、skip-grant-tables
が指定されていないか確認して、
Query Rewrite Pluginsでクエリを書き換えてみる
それでは、SELECT ?
で合致するクエリをSELECT ? + 1
に書き換えるという処理を行うパターンです。
mysql> INSERT INTO query_rewrite.rewrite_rules (pattern, replacement) VALUES('SELECT ?', 'SELECT ? + 1'); Query OK, 1 row affected (0.00 sec)
さて、
mysql> SELECT 1; +---+ | 1 | +---+ | 1 | +---+ 1 row in set (0.00 sec)
実は、CALL query_
を呼んであげる必要があります。実行後は以下のように変更されていることがわかります。
mysql> CALL query_rewrite.flush_rewrite_rules(); Query OK, 1 row affected (0.03 sec) mysql> SELECT 1; +-------+ | 1 + 1 | +-------+ | 2 | +-------+ 1 row in set, 1 warning (0.00 sec)
さて、
mysql> INSERT INTO query_rewrite.rewrite_rules (pattern, replacement) VALUES('SELECT ?', 'ELECT ? + 1'); Query OK, 1 row affected (0.00 sec)
登録自体は文字列の登録なので、
mysql> CALL query_rewrite.flush_rewrite_rules(); ERROR 1644 (45000): Loading of some rule(s) failed.
このように正しくないSQLは、
mysql> select * from query_rewrite.rewrite_rules\G *************************** 1. row *************************** id: 6 pattern: SELECT ? pattern_database: NULL replacement: ELECT ? + 1 enabled: YES message: Parse error in replacement: >>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ELECT ? + 1' at line 1<< pattern_digest: NULL normalized_pattern: NULL 1 row in set (0.00 sec)
ということで、
それ以外のカラムに関しても簡単に説明をしていきます。pattern_
これを上手く使う方法として、
mysql> select * from zipcode USE INDEX(test01) limit 1; ERROR 1176 (42000): Key 'test01' doesn't exist in table 'zipcode'
そこで以下のように、
mysql> INSERT INTO query_rewrite.rewrite_rules (pattern_database, pattern, replacement) VALUES('zipcode','SELECT * FROM zipcode USE INDEX(test01) limit ?', 'SELECT * FROM zipcode limit ?'); Query OK, 1 row affected (0.02 sec) mysql> CALL query_rewrite.flush_rewrite_rules(); Query OK, 1 row affected (0.02 sec)
すると当然ですが、
mysql> select * from zipcode USE INDEX(test01) limit 1; +-------+-------------+----------+-----------------------+--------------------------------------+-----------------------------------------------+------------+--------------------+--------------------------------+ | code | old_zipcode | zip_code | prefecture_kana | city_kana | town_kana | prefecture | city | town | +-------+-------------+----------+-----------------------+--------------------------------------+-----------------------------------------------+------------+--------------------+--------------------------------+ | 01101 | 060 | 0600000 | ホッカイドウ | サッポロシチュウオウク | イカニケイサイガナイバアイ | 北海道 | 札幌市中央区 | 以下に掲載がない場合 | +-------+-------------+----------+-----------------------+--------------------------------------+-----------------------------------------------+------------+--------------------+--------------------------------+
あまりないとは思いますが、
デメリット
Query Rewrite Pluginsは動的にMySQLでクエリを書き換えることができるので、
installしてプラグインを有効にした場合、
まとめ
今回紹介したQuery Rewrite Pluginsは、
しかし、