2015年2月25日水曜日

MySQL 5.7の暗黙のデフォルトに対するプロポーザル その2

日々の覚書: MySQL 5.7で暗黙のデフォルトが変わりそうなはなし の時に紹介したのと同じく、Morgan Tockerがまた5.7のデフォルト値のプロポーザルを発表しています。



前回がトランザクション周りやInnoDB周り(これは、彼の2つのポストを俺が1つにまとめちゃったからだけど)だったのに対し、今回はそれ以外、スローログ関連とか多いですね。

原文は Proposal to change additional defaults in MySQL 5.7 (February Edition) | Master MySQL こちらです。

* log_slow_admin_statements
  * 有効にするとALTER TABLEとかも閾値を上回った時にスローログに出るようになる(デフォルトでは、ALTER TABLEステートメントはどれだけ時間がかかってもスローログには出ない)
  * ドキュメントに "This variable was added in MySQL 5.7.1." とか書いてあってファッてなる(5.6系は5.6.11からって書いてある) けど、これはもとはオプションでしか提供されていなかったこの機能がサーバー変数として与えられたのがこのバージョン、ということ。
    * 5.5だと、SHOW GLOBAL VARIABLESで見えないしオンラインで変更できないけど、5.6.11 & 5.7.1以降は見えるしSET GLOBALで変えられる。

log_slow_slave_statements
  * 有効にすると、レプリケーションのSQLスレッドが閾値を超えた場合にもスローログに出るようになる(デフォルトではSQLスレッドの処理したSQLはどれだけ時間がかかってもスローログには出ない)
    * こいつも 5.6.11 & 5.7.1 からサーバー変数に昇格 :)

* long_query_time
  * 言わずもがな。長い長いと言われてきたデフォルトが10から2へ。

* log_queries_not_using_indexes
  * デフォルトでONに。
  * クエリーのうち、"WHERE句に(?)" インデックスが使われていないものを、long_query_timeを無視してスローログに書き出す(min_examined_row_limitの影響は受ける)
  * 手元の5.6.23だとORDER BY *だけ* を狙ったキーで打つと出力される。WHEREを一部引っ掛けつつメインはORDER BY狙い、みたいなキーなら出力されない。

* min_examined_row_limit
  * 0から1000へ
  * long_query_timeを超えた、またはlog_queries_not_uxing_indexesにマッチしたクエリーでも、この値よりもExaminedが少ない場合はログに記録しない。よって0は(前提条件にマッチすれば)全記録。

min_examined_row_limitは「long_query_timeより時間かかってるのに何故か出力されない!!1」とかいう人が(今ですら)たまにいるので、採用されたら結構出てくるんじゃないか疑惑。

これを書いててそんな気がしたので、別途まとめておいた。
日々の覚書: MySQLのスローログ関連のパラメーターが評価される順番


* mysqlコマンドラインクライアントのshow-warningsオプション
  * デフォルトでONに
  * クエリーの結果がWARNINGを持って返ってくると、自動でshow warningsを叩いてくれるやつ。

150225 11:08:55     5 Query     SET sql_mode= ''
150225 11:08:56     5 Query     create table t2 (num int) engine= moga
                    5 Query     show warnings

別に内部でステキなことをしているわけじゃなく、本当にshow warningsをmysql_real_queryで押し込んでるだけ。LOAD DATA INFILEとかの時にデータが切り詰められたりすると大量に画面が埋め尽くされたりするヤーツ。


* group_concat_max_len
  * 1024から1Mへ。ずいぶんでかくなったな。
  * GROUP_CONCAT関数の結果がこの値を超えた場合、先頭のこの文字数だけが結果に載って残りは切り詰められる。

mysql56> SELECT @@group_concat_max_len;
+------------------------+
| @@group_concat_max_len |
+------------------------+
|                   1024 |
+------------------------+
1 row in set (0.04 sec)

mysql56> SELECT d, CHARACTER_LENGTH(val) FROM (SELECT num % 10000 AS d, GROUP_CONCAT(val) AS val FROM t1 GROUP BY 1) AS dummy LIMIT 3;
+------+-----------------------+
| d    | CHARACTER_LENGTH(val) |
+------+-----------------------+
|    0 |                  1024 |
|    1 |                  1024 |
|    2 |                  1024 |
+------+-----------------------+
3 rows in set, 10000 warnings (4.75 sec)

mysql56> SHOW WARNINGS LIMIT 3;
+---------+------+----------------------------------+
| Level   | Code | Message                          |
+---------+------+----------------------------------+
| Warning | 1260 | Row 32 was cut by GROUP_CONCAT() |
| Warning | 1260 | Row 64 was cut by GROUP_CONCAT() |
| Warning | 1260 | Row 96 was cut by GROUP_CONCAT() |
+---------+------+----------------------------------+
3 rows in set (0.00 sec)

mysql56> SET SESSION group_concat_max_len= 1 * 1024 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql56> SELECT d, CHARACTER_LENGTH(val) FROM (SELECT num % 10000 AS d, GROUP_CONCAT(val) AS val FROM t1 GROUP BY 1) AS dummy LIMIT 3;
+------+-----------------------+
| d    | CHARACTER_LENGTH(val) |
+------+-----------------------+
|    0 |                  3299 |
|    1 |                  3299 |
|    2 |                  3299 |
+------+-----------------------+
3 rows in set (4.58 sec)

こんなかんじ。

* max_allowed_packet
  * 4Mから64Mへ

* symbolic-links
  * OFFへ
  * これがあるとdatadirからファイルを移動してシンボリックリンクを張っておけば今までどおり使えるよ、というやつ。そういえばそんなのあったね。

* temp-pool
  * OFFに
  * 昔のLinuxではテンポラリーファイル名を作るときにメモリーリークの可能性があったから、テンポラリーファイル名をあらかじめ作っておく、みたいなオプションらしい。実はずいぶん昔からある。初めて知った。

* table_open_cache_instance
  * 1から16に
    * 16ってRDSといっしょですね :)
  * 16コア以上なら8から16が推奨ってもともと書いてあったしね :-P


mix_examined_row_limitだけ手で0にしたい所存、それ以外はいいんじゃないですかねって感想。
プロポーザルなので、意見がある人は本人のブログまでどうぞ :)

Proposal to change additional defaults in MySQL 5.7 (February Edition) | Master MySQL

0 件のコメント :

コメントを投稿