Mysql意外に便利なコマンド

Mysql意外に便利なコマンド
Mysql
2022年10月17日 更新

振り返る

Mysqlは初心者にとってよく使われているコマンドはselect系が多く、その他をリストアップしてみます。

コマンド説明
SELECTデータの取得SELECT * FROM [USER、DATABASE、TABLE名前]
CREATEUSER、DATABASE、TABLEに対する作成することCREATE DATABASE
DROPUSER、DATABASE、TABLEに対する削除操作DROP DATABASE
ALTERUSER、DATABASE、TABLEに対する変更操作ALTER DATABASE
GRANTuserに対する操作GRANT [権限] ON
SHOWUSER、DATABASE、TABLEに対する情報の確認SHOW DATABASE
INSERT INTOTABLEにデータを入れる操作INSERT INTO [TABLE] [DATA情報]
DELETE FROMTABLEのレコードを削除する操作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;

出力は以下になりそうでしょう。

namegroup_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`;