4/1なのでMySQLにPLEASE句を追加するパッチを書きました

ぬいぐるみが好きな方のDBAです。

さて今日は4/1 、色々新しいものに巡り合う春ですね。
そんな中、日本MySQLユーザ会副代表の sakaik さんが面白いMySQレ(まいえすきゅーれ、と読むんでしょうかね)の新機能を紹介されていました。

時代に即したMySQレの新機能:PLEASE句 - sakaikの日々雑感~(T)編

これは是非MySQL(マイエスキューエル)にも取り入れるべきだと思い、急いでパッチを書きました。
MySQL 5.6.51(なお、MySQL 5.6は既にEOLです、本番に導入する場合には5.7かそれ以降にパッチをリライトすべきでしょう)にPLEASE句を追加するパッチはこちらです。


このパッチを適用してビルドしたMySQLを使うと、

mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set, 1 warning (1.00 sec)

mysql> SHOW WARNINGS;
+---------+--------+---------------------------------------------------------------------------------------------------------------------------+
| Level   | Code   | Message                                                                                                                   |
+---------+--------+---------------------------------------------------------------------------------------------------------------------------+
| Warning | 490825 | Please add PLEASE clause for speedup MySQL. See https://sakaik.hateblo.jp/entry/20210401/mysql_please_clause_in_aprilfool |
+---------+--------+---------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (1.00 sec)

mysql> PLEASE SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

“PLEASEをつけると性能がアップ" を実装するのは難しかったので、逆に “PLEASEが無いとMySQLがヘソを曲げて1秒Sleepを入れる" 実装にしました。
PLEASE句は先頭に置くものは全て対応できていますが、後置のPLEASE ( SELECT .. PLEASE のような )には対応していません。
sql/sql_yacc.yy を読んでもらうとわかりますが、yaccはそういう書き方面倒なんや…。

mysql> PLEASE CREATE DATABASE d1;
Query OK, 1 row affected (0.00 sec)

mysql> PLEASE SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| d1                 |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

折角なので、sql_modeに STRICT_PLEASE_MODE も実装しました。
このsql_modeがセットされている場合、PLEASE句を含まないクエリーは実行せずにエラーで返します。

mysql> PLEASE SET SESSION sql_mode = 'STRICT_PLEASE_MODE';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE DATABASE d2;
ERROR 32073 (HY000): Please add PLEASE clause. I don't run your query.

mysql> PLEASE SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| d1                 |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> PLEASE CREATE DATABASE d2;
Query OK, 1 row affected (0.00 sec)

mysql> PLEASE SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| d1                 |
| d2                 |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

このようにPLEASE句をMySQLでも使うことができるようになります。
MySQレ(まいえすきゅーれ)の新機能をMySQL(まいえすきゅーえる)にもバックポートして、コンピュータと人間とが共に気持ちよく過ごせる社会の実現に一歩近付いた話でした。


では、元記事のsakaikさんのブログから最後のセンテンスを引用して締めたいと思います。

なお、蛇足ながら本日4月1日でございますことを付記し、本アーティクルをおしまいとしたいと思います。
Please DO NOT believe this article.

Have a good MySQL!

GMOメディアでは仲間を募集しております

当社は、「For your Smile,with Internet.」という企業理念のもと、多くの笑顔と感動を生み出していくべく、インターネットメディア媒体を多ブランドでサービス展開しています。
募集内容について詳しくはコチラをご覧ください