MySQLの細かいTips

kamipoさんによるmy.cnfgithubにあがってるのでそっちのほうがスーパー参考になると思われる

ctrl + w で単語削除

$ vi $HOME/.editrc

bind "^U" vi-kill-line-prev
bind "^W" ed-delete-prev-word

bashなどはaaa bbb cccという文字列があった場合、ctrl + wで単語指定で削除できますが、MySQLプロンプトのクエリ上でも実現するための設定です。

よく select * from hoge where id = 10000; ってあった場合に10000だけ消したいとかって時に使う。

他にも以下のやつはよく使います。(標準で使えるはず…)

my.cnfの場所探し

$ mysql --help | grep my.cnf

複数あったら表示されて、左から順番に読み込まれる。

mysqlのプロンプト表示

# my.cnfに記載

[mysql]
prompt="[\u@\h](\d)> "

これを入れると[root@localhost](database)>みたいな表示になる

最低限はこれあれば大丈夫な気がするが、本番環境の場合は色変えたいとかあれば頑張ってみてもいいかもしれない。

スキーマ名の補完

# my.cnfに記載

[mysql]
auto-rehash

テーブル名の補完等ができるようになる

mysqlのsafe-updateについて

where句のつけ忘れたupdateとかdeleteとか悲しみに溢れる前に弾いてくれます

# my.cnfに記載

[mysql]
safe-updates

コマンドラインからMySQLを実行したい

$ mysql -uhoge -phoge database -e 'select * from hoge;'

コマンドラインから実行して加工したい時によく使う。 -Nもつけると結果からカラム名が削除されるのでなお加工しやすい。

explainについて

explainは死ぬほど記事があるので、そちらを読んでもらって自分があんま知らなかったことだけ記載。

explain EXTENDED

explain EXTENDED SELECT * FROM hoge where name = 'fuga'

explainに EXTENDEDをつけるとfilteredというカラムが追加される。これはテーブルに対して何%ぐらいがWHERE句などで絞り込まれるかの推測値が出力されるらしい。 (が、100以外見たことないのでよくわからん。。) MySQLのバージョンが5.7になるとExplainのデフォルトに載るらしい

explain format=json SELECT * FROM hoge where name = 'fuga'

ちなみにformatをjsonに指定すると、5.6でもfilteredのデータは載っかる

order by について

created_at の order by は撲滅しよう

スローログ周り

(あとでいい感じにするが、とりあえずリンクだけ)
日々の覚書: MySQLのスローログ関連のパラメーターが評価される順番

mysql > select start_time + INTERVAL 9 HOUR AS start,query_time,sql_text from mysql.slow_log where start_time > '2015-01-01 00:00:00' order by start_time desc;

RDSの場合、タイムスタンプUTCなので+9時間しておくと実際の時間と比較できてわかりやすい。 fileのほうがパフォーマンスいいとおもうけど、RDSでfileってできるんかな…