Mysql意外に便利なコマンド
振り返る
Mysqlは初心者にとってよく使われているコマンドはselect
系が多く、その他をリストアップしてみます。
コマンド | 説明 | 例 |
---|---|---|
SELECT | データの取得 | SELECT * FROM [USER、DATABASE、TABLE名前] |
CREATE | USER、DATABASE、TABLEに対する作成すること | CREATE DATABASE |
DROP | USER、DATABASE、TABLEに対する削除操作 | DROP DATABASE |
ALTER | USER、DATABASE、TABLEに対する変更操作 | ALTER DATABASE |
GRANT | userに対する操作 | GRANT [権限] ON |
SHOW | USER、DATABASE、TABLEに対する情報の確認 | SHOW DATABASE |
INSERT INTO | TABLEにデータを入れる操作 | INSERT INTO [TABLE] [DATA情報] |
DELETE FROM | TABLEのレコードを削除する操作 | DELETE FROM [TABLE] [DATA条件] |
また、DBは開発の段階であんまり触れないかもしれないですが、ITサービスの継続的な運営では、一番使われているものではないかと思います。
普段使われていないが、mysqlにはこんなコマンドあるとは思いませんでした。
いくつ便利になりそうなコマンドを紹介したいと思います。
group_concat
データをグループ分けてリストアップしたい場合、
多くの場合、下記でリストアップし、appendしているかと思います。
select name from `items` group by name;
こちらのselect文だと、情報多すぎる時あるので、group_concat
で必要なものを勝手に繋いてくれます。
select name,group_concat(id) from `items` group by name;
出力は以下になりそうでしょう。
name | group_concat(id) |
---|---|
日用品 | 1,2,3,4 |
肉類 | 5,6,7,8 |
野菜 | 9,10,11 |
replace
ORMを使っているとき、対象のMODELを使って、対象の属性を切り替えることが多いと思いますが、mysqlのコマンドでも実現できます。
replace
はできるのは指定対象のStringをAからBに変えることです。
例:
update items set name=REPLACE(name,'A','B') where id=1;
また、入力間違いとか、一括でデータを変更するときも適用されます。(where条件の工夫になります)
on duplicate key update
こちらは条件付きのものですが、具体的に
データを挿入するとき、とあるキーワードに対して、テーブルには同じものは存在しているのかどうかは保証しないですね。
この条件を付けると、レコードの唯一性を保つことができ、自動上書きも可能になります。
INSERT INTO `items`(`id`, `category`, `name`, `edit_date`)
VALUES (1, '肉類', 'ジンギスカン', now())
on duplicate key update name='ステーキ',edit_date=now();
上記によって、肉類のジンギスカンは販売やめたが、データをステーキに引き継いてもらいたいときが、ノーダメージでデータを引き継いてもらいました。
show processlist
運営でよく使われているコマンドになります。
パターンとして、mysqlは何かの問題を起こしました、すごく遅延出しています、原因の特定として使われているコマンドです。
機能として、現在mysqlのプログレスをリストアップしてくださいこと。
実行の秒数や対象DBとコマンドは分かれて、以上あるプログレスあれば、kill
コマンドで以上を排除できるではないかと思います。
mysqldump
データはずっとmysqlに保存するのはいいものの、ユーザーのテープルだと、なくなると大変になります。
定期的にバックアップとして、mysqlから必要なデータをエクスポートしてどこか安全な場所で保存したほうがいいと思います。
例えば、S3にDBのバックアップを保存していくことによって、サービスの一貫性を保つことができ、 運営の時、トラプルある場合、すぐ対応できることができます。
例:
mysqldump -h 192.168.1.1 -u root -p123456 dbname > backup.sql
create table ... select
バックアップはmysqldump
あるですけど、緊急事態で、とあるテーブルに早くバックアップ作りたい場合あるではないかと思います。
普通に考えたら、以下のフローを踏むだろうと。
1.まずは臨時なテーブルを作る
2.対象のテーブルの情報を作った臨時テーブルに流れ込む
上記はこちらのコマンドで一発でできます。
create table items_temp select * from `items`;