MySQLの細かいTips
kamipoさんによるmy.cnf がgithubにあがってるのでそっちのほうがスーパー参考になると思われる
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
だけ消したいとかって時に使う。
他にも以下のやつはよく使います。(標準で使えるはず…)
ctrl + a
先頭に移動ctrl + e
末尾に移動ctrl + r
過去に入力したコマンドのインクリメンタルサーチ
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ってできるんかな…