2018年 07月の投稿を表示しています

MySQL (MariaDB) のスローログを出す設定をする

インデックスつかってる?やばない?みたいなクエリを調べたいので、スローログで出せた気がするなあ、ってメモ。

スローログに関する設定の確認

> show variables like '%slow%';
+---------------------+--------------------------------------------------------------------------------------------------------------+
| Variable_name       | Value                                                                                                        |
+---------------------+--------------------------------------------------------------------------------------------------------------+
| log_slow_filter     | admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |
| log_slow_queries    | OFF                                                                                                          |
| log_slow_rate_limit | 1                                                                                                            |
| log_slow_verbosity  |                                                                                                              |
| slow_launch_time    | 2                                                                                                            |
| slow_query_log      | OFF                                                                                                          |
| slow_query_log_file | 522d4fac608d-slow.log                                                                                        |
+---------------------+--------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)
> show variables like '%long%';
+---------------------------------------------------+-----------+
| Variable_name                                     | Value     |
+---------------------------------------------------+-----------+
| deadlock_search_depth_long                        | 15        |
| deadlock_timeout_long                             | 50000000  |
| long_query_time                                   | 10.000000 |
| max_long_data_size                                | 1048576   |
| performance_schema_events_waits_history_long_size | 10000     |
+---------------------------------------------------+-----------+
5 rows in set (0.00 sec)
> show variables like '%log_queries%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF    |
+-------------------------------+-------+
1 row in set (0.00 sec)
> show variables like '%output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.00 sec)

log_slow_queries と slow_query_log がいてオッ?と思ったが slow_query_log を使うのが正しいらしい。

profiling - Mysql: What is the difference between "slow_query_log" vs "log_slow_queries" - Stack Overflow

 

その他の設定値はフィーリングで大丈夫(ダメ)
このあたりで説明は補完できる。

MySQL :: MySQL 5.7 Reference Manual :: 5.1.7 Server System Variables

スローログの設定と動作確認

set global slow_query_log = ON;
set global long_query_time = 1;
set global log_queries_not_using_indexes = ON;
set global log_output = 'TABLE';

log_output を TABLE にすると mysql.slow_log テーブルに出る FILE にするとファイルに出る。

まずは TABLE にした場合

> use hoge;
> select * from users where nanika_id = 1;

> use mysql;
> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
24 rows in set (0.00 sec)

> select * from slow_log;
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+-----------------------------------------+
| start_time                 | user_host                 | query_time      | lock_time       | rows_sent | rows_examined | db   | last_insert_id | insert_id | server_id | sql_text                                |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+-----------------------------------------+
| 2018-07-19 05:08:05.999111 | root[root] @ localhost [] | 00:00:00.003893 | 00:00:00.002550 |         0 |             0 | hoge |              0 |         0 |         0 | select * from users where nanika_id = 1 |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+-----------------------------------------+
1 row in set (0.00 sec)

> use hoge;
> explain select * from users where nanika_id = 1;
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
|    1 | SIMPLE      | users | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using where |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

次に FILE の場合。

$ pwd

/var/lib/mysql


$ tail 522d4fac608d-slow.log

# Time: 180719  5:33:26
# User@Host: root[root] @ localhost []
# Thread_id: 3  Schema: hoge  QC_hit: No
# Query_time: 0.000337  Lock_time: 0.000141  Rows_sent: 0  Rows_examined: 0
SET timestamp=1531978406;
select * from users where nanika_id = 1;

slow_query_log_file で指定した場所に出る /var/log/mysql/... みたいな指定をする必要がありそう。


インデックスを使用していないクエリも出してくれる、便利。

そのほか

set global しただけだと mysql サーバーを終了したときに設定が消えてしまうので、必要に応じて my.cnf に記載。

[mysqld]
slow_query_log=ON
long_query_time=1
log_queries_not_using_indexes=ON
log_output=FILE
slow_query_log_file=hogehoge-slow.log
$ echo 'show variables like "%slow%";' | mysql

Variable_name	Value
log_slow_filter	admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
log_slow_queries	ON
log_slow_rate_limit	1
log_slow_verbosity
slow_launch_time	2
slow_query_log	ON
slow_query_log_file	hogehoge-slow.log

大丈夫そう。

日本語の折り返しを正規表現で解決する mikan.js を PHP に書き換えた

できたものがこちらです

作った背景

日本語の折り返しが中途半端になってつらい!機械学習で改善するぞ!という話が過去にありました。
google/budou: Budou is an automatic organizer tool for beautiful line breaking in CJK (Chinese Japanese and Korean).

それからしばらくして、いやいや機械学習じゃなくてもいいのでは?というものが出てきました。
mikan.js : 機械学習なしで、日本語の単語の改行を処理するライブラリを書いた

これって別に JS で表示するときにアレコレしなくても、普段のサーバサイドでいい感じにしてもいいのでは??と思い PHP に移植してみた次第です。

移植する流れ

元のコードを眺めて、同じような処理に書き換えていく簡単なおしごと。
幸いにも、そこまで難しいロジックでは無いので、動作をみながら書き換えていきました。

正規表現のあたりだけ、言語の違いでちょっと詰まったので、ドキュメントを見ながら動作を見ながら随時書き換えていくようなコツコツ作業でした。

言語の書き換え、双方の言語について理解が深まるのでオススメです。

工業的 Minecraft プレイ日記 #10 / Ender IO の電動スポナー

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


EnderIOの環境では、通常のスポナーを壊すと、壊れたスポナーとしてドロップします。
そこへ、モブの魂を入れるビンを作って、Soul Binderを使って好きなモブのスポナーにすることができます。

で、食糧難になっていたので、鶏肉を量産することにしました。

こんな感じで電力を与えると自動でスポーンするようになりました。

で、柵で囲って鳥まみれにしようと思ったのですが、どうやらスポーンできる上限があるようで、一定数以上は無理でした。

ので、貯めるのをあきらめて、水流で流し、ExtraUtilitiesのスパイクで倒すことにします。
鳥肉の備蓄が十分になれば、遠距離攻撃のない歩行系のモブ、ウィザースケルトンなどに入れ替える予定です。

つづく。

工業的 Minecraft プレイ日記 #9 / Ender IO の経験値銀行を作る

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


Simple でよいので Alloy Smelter と Sag Mill を作って色々素材を投下すると出来上がります。


できました。

右クリックするとメニューが出てきて、ポチポチして経験値を出し入れすることができます。
ほかにも Mekanism や EnderIO のパイプで液体としてを搬入出することも可能です。

これでこまめに出し入れしたら、事故死で経験値を失うこともなくなって素敵!

つづく。

工業的 Minecraft プレイ日記 #8 / Mekanism の鉱石 3 倍化ラインを作る

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


そろそろ機械のほうもパワーアップしていきたいので、まずは鉱石を増やす方向に強化していきます。
なるべく掘ったままの鉱石資源を持っておいて、必要になるたびに 2 倍化ラインに入れていましたが、もうひと手間増やし 3 倍化ラインを作ります。

3 倍化には化学注入機で、鉱石に酸素を入れる作業が増えます。
酸素は水をポンプで吸い上げ、電解分離機にかける必要があります。

そうして出来たものがこちらです。

ホッパーは鉱石を自動で投入したいので置いてあります。

精製室に酸素をパイプで送り込むと稼働します。

電解分離機は片方がいっぱいになると止まってしまうので、不要な方は余剰分を破棄にしておくとよさそうです。

で、動かしてみると微妙に電力が足りず止まることが多かったので、熱発電機と溶岩で微力ながら発電してみました。

つづく。

工業的 Minecraft プレイ日記 #7 / 倉庫を強化する

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


Storage Drawrs を使って一部のアイテムを保存してましたが、チェストにも入れっぱなしも各種アイテムが増えてきて、どこに何があるのかつらくなってきました。
ので、倉庫を拡大します。

Storage Controller を作って、周りに Storage Drawr を置けばすべてリンクして出し入れが可能になります。
ので、これを利用して、既存の倉庫から新しい倉庫へとアイテムを移動していきます。

このときはまだ Mekanism をちゃんとわかっていなかったのでロジスティカルソーターでストレージからアイテムを出しています。
おそらくただのパイプを出力モードにするだけでも大丈夫です。

すでにある鉱石倍化ラインからもパイプをつなげ、鉱石→インゴットになったものを直にストレージへ収納できるようにします。

だんだんと倉庫を拡大していきます。

変換ストレージを使うことで、鉱石と鉱石ブロックを変換して取り出したり Extra Utilities 2 で追加された圧縮丸石にして容量を詰めたりできます。

さらにコンパレータを使ってレッドストーンアップグレード 2 にすると容量ゲージがでたり、各種鉱石アップグレードで容量を増やすことができます。
とりあえず大量にやっても仕方ないので、溢れそうな鉱石系のところへ 8 倍くらい入れておきます。

そして Extra Utilities 2 のインデクサを繋げることで、ストレージ全体からアイテムを要求することができるようになります。
Remote Controller を持っていれば遠隔からでもアクセスできます。
日本 Wiki には地底だと使えないなど書いてありますが、わたしの環境では問題なく使えました。

おそらくですが、遠隔になるとチャンクが読み込まれなくなるので、チャンクローダーを設置すると、どこからでも大規模倉庫にアクセスできるようになりそうです。

つづく。

工業的 Minecraft プレイ日記 #6 / 小話:溶岩るつぼ、スライムの

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


溶岩るつぼ

発電できたり、素材にしたり、何かしらに使うと思うので、溶岩をストックしておきたいなあと思いました。

調べてみると Thermal Foundation で溶岩るつぼという、溶岩を作る機械があるようです。

こういうベーシックな機械の土台が必要みたいです。これはすでにある鉱石から作れるので OK

そしてこっちの部品。
エレクトラムという鉱石が必要で、それは砕いた鉱石を混ぜて、かまどに放りこむとできるようです。


というわけでできました。

電力が必要ですが、ネザーラックから溶岩を生成できるので、無限に溶岩を作ることができそうです。

スライムの木

以前ネザーに行ったタイミングで、見つけていました。

  

持って帰ってきて、ネザーで見つけた土の上に苗を植えたらいつの間にか生えていました。
4 つくっつけている理由は特にありません。

このときの木の部分になるブロックを加工すると、スライムボールと同様に使えるものになるので
スライムを探さなくてもスライムボールが量産できるようになりました。

つづく。

工業的 Minecraft プレイ日記 #5 / Cavernを探検

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


Cavern です。
鉱石資源が無尽蔵にあるディメンションが追加される mod です。

For Japanese - Pages - Cavern II - Mods - Projects - Minecraft CurseForge

苔石で囲いエメラルドを入れることで大洞窟ディメンションへの道が開かれます。

中には見慣れない鉱石もありますが、面白いのはランダマイト鉱石です。木の柵とか、何かの鉱石ナゲットとか、鉄の斧とか、なんでも出てきます。
出すぎで難易度バランスが壊れることを考慮して、壊すのをやめました。

アクアマリン鉱石がありました。
これは水没した水の洞窟ディメンションに行くために必要です。

戻ってきてポータルを作ってみましたが、採掘ランクが足りないようです。

採掘ランクは Cavern のディメンションで鉱石を掘ることで増えていきます。また後でやって行ってみましょう。

しばらく探検しても書斎が見つからず、幻の世界の切符が手に入りません。

なので、とりあえず果てなき洞窟のポータルを作りました。苔石で囲み、ダイアモンドで開きます。
中は広大な空間が広がっていて、敵の処理が大変そうです。とりあえずこのディメンションは探検するのが大変なのでまたの機会に。

つづく。

工業的 Minecraft プレイ日記 #4 / ぼくの考えた最強のピッケルを作る

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


引き続き Tinkers Construct です。

前回では黒曜石ピッケルを作り、コバルトとアーダイトを掘れるようになりました。
今回はそれらの素材を使って、強力なピッケルを作ります。

ここで役に立つのが、ゲーム開始時にインベントリにあった解説書 Materials and You です。
なくても作れるっぽいので NEI 見てどうぞ。
ここを見ると、各素材がどのような性能、効果を持っているか、どのような改造ができるかが書かれています。

そして、いい感じの組み合わせを作ってみました。
頭部分が黒曜石、持ち手はコバルト、留め具がアーダイトです。

それぞれの特殊効果を説明すると、

黒曜石のピッケル頭 = Duritae
たまに耐久を消費しない、たまに耐久を倍消費する

コバルトの持ち手 = Lightweight
採掘速度が上がる

アーダイトの留め具 = Petramor
石を採掘するときに耐久が回復することがある

そして、黒曜石のピッケル頭なので、コバルトが掘れる採掘レベルを持っています。
今回のワールドではコバルト、アーダイトが最上位なので、それらが掘れる=何でも掘れる状態です。

 

ここから Tool Station を使ってさらにパワーアップしていきます。

ラピスラズリ = Luck
複数つけることで幸運エンチャント相当の効果

光ったコケ = Mending moss
経験値をツールに貯めて、徐々に消費することで耐久が回復する
光ったコケはレシピが出なくてわからなかったんですが、苔石から苔を作って、本棚を右クリックで自分の経験値を消費して作れました。

近くに鉱山的なオブジェがあったので、これを試しに解体してみます。
すべて今回作ったピッケルで解体したのですが、石を掘るおかげで耐久が一切減りませんでした。無限に掘れる…。

Vein Miner による一括採掘も適用されるので、かなり捗ります。

つづく。