MySQL
- MySQL
起動/終了/生存確認
起動
- mysqld –user=mysql &
- mysqld_safe
- mysql.server
終了
mysqladmin -u root -p shutdown &
生存確認
mysqladmin -u root ping
参考
ログイン
mysql -u ${ユーザ名}
mysql -u ${ユーザ名} -p
- ログイン時にパスワードを聞かれる
mysql -u ${ユーザ名} -p${パスワード}
- pオプションの後ろにスペースを入れてはいけない
mysql -h ${接続先ホスト} -u ${ユーザ名}
ページャーの設定
実行結果をlessに渡したい時などに使う。
オプションは任意。
${ログインコマンド} --pager="less -S -n -i -F -X"
参考
.mylogin.cnfを使用する
ファイル作成
- 下記実行。
mysql_config_editor set --host=${ホスト名} --login-path=${グループ名} --user=${MySQLユーザ} --password
- パスワードを聞かれるので、パスワード入力
~/.mylogin.cnf
ファイルが作成される。
ログイン
mysql --login-path=${グループ名}
ファイル参照
mysql_config_editor print --all
参考
- 4.6.7 mysql_config_editor — MySQL 構成ユーティリティー:MySQL 8.0 リファレンスマニュアル
- How to use .mylogin.cnf:ゆるふわキャンパー
ファイルから実行する
下記のいずれか
- shell> mysql ${DB名} < ${ファイル名}
-N
オプションでカラム名非表示にできる。- tsvフォーマットで出力される。
- コンソールで出力したときと同じ見た目のファイルが欲しい(テキストとして貼り付ける等)時は、
-t
オプションを追加する。
- mysql> source [ファイル名]
- mysql> ./[ファイル名]
データベース作成
CREATE DATABASE <DB名>
ユーザ一覧表示
mysqlユーザでuserテーブルを参照する。
use mysql
select user, host from user;
ユーザ作成
例
CREATE USER 'comment_user'@'localhost' IDENTIFIED BY 'userpassword';
参考
権限の付与
GRANT ${付与する権限} ON ${対象のDB}.${対象のテーブル} TO ${対象ユーザ}@${クライアントホスト};
例
comment_user@localhostに、comment_managerデータベースの全テーブルに対する権限として、SELECT, INSERT, UPDATE, DELETEを付与する。
GRANT SELECT, INSERT, UPDATE, DELETE ON comment_manager.* TO comment_user@localhost;
参考
付与されている権限の確認
show grants for '${ユーザ名}'@'${ホスト名}'
権限のはく奪
REVOKE 権限
ON データベース名.テーブル名
FROM 'ユーザ'@'ホスト'
CSVインポート
設定修正
MySQLにrootユーザでログイン。
set persist local_infile=1;
CSV作成
1,"hoge"
登録用SQL
load data local
infile "${csvファイルのパス}"
into table
${DB名}.${登録対象テーブル名}
fields
terminated by ','
optionally enclosed by '"';
SQL実行
mysql --local-infile=1 -h ${DBサービスホスト} -u ${DBログインユーザ} -p${DBログインパスワード} ${DB名} < ${登録用SQLパス}
参考
【MySQL】csvファイルをDBにインポートする方法:Qiita
別解
ファイル名に制限がある。
mysqlimport --local -u ${DBログインユーザ} -p${DBログインパスワード} ${DB名} < ${テーブル名}.csv
# これでもOK。
mysqlimport --local -u ${DBログインユーザ} -p${DBログインパスワード} ${DB名}.${テーブル名}.csv
参考
[MySQL] テーブルにファイルをインポートする – mysqlimport編:ねこの足跡R
実行計画取得
EXPLAIN ${対象SQL}
実行コマンド例
mysql -t -h ${ホスト名} -u ${ログインユーザ} -p${ログインパスワード} ${対象DB} < ${評価対象SQL} > ${評価結果}
※-tオプションはフォーマット指定。tsv形式で出力したい場合は不要。
実行結果例
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------+
| 1 | SIMPLE | T_COMMENT | NULL | ALL | NULL | NULL | NULL | NULL | 556978 | 100.00 | NULL |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------+
1 row in set, 1 warning (0.01 sec)
実行結果の読み方
select_type
値 | 説明 |
---|---|
PRIMARY | 一番外側 |
DERIVED | 派生テーブル(サブクエリ) |
type
値 | 説明 |
---|---|
const | 最大1件。最初に読む。 |
ref | 前テーブルの行ごとに検索。一致するインデックスを持つ行をtableから読まれる。行が少ない場合はこれが最適。 |
eq_ref | 前テーブルの行ごとに検索。一致す値を持つ行tableから読まれる。refが使えない場合は最適。 |
ALL | テーブルスキャン。不適切。 |
index | インデックス版のALL。ALLほどではないが不適切。まし、という程度。 |
possible_keys
行の検索に使用できるキー。Explainの順と無関係に出力されるので、実際には使用できないこともある。
key
実際に使用されたキー。
ref
keyを何と比較したか。
rows
比較対象の行。
filterd
フィルタ処理される推定割合。
rowsの行がどこまで減るか。
Extra : 実行戦略
- Using where
- whereで検索する。基本的に気にする必要はないが、下記の場合は注意。
- typeがindexまたはALL。
- rowsが多く、whereで弾かれる行が多い。
- JOIN時に内部表で出る。
- whereで検索する。基本的に気にする必要はないが、下記の場合は注意。
- Using index
- 単一indexで処理できている。早い。
※type = index で、Using where と Using indexが両方出るのは、whereの処理でindexを見ている。
参考
実際に読んでみた
メモ:読み方が妥当かは未確認。 ※後で修正
- keyを確認する。
MySQL が実際に使用することを決定したキー (インデックス) を示します。
- type = ALLの列に着目する。(ALLはよくない。)
- possible_keysを確認する。
MySQL がこのテーブル内の行の検索に使用するために選択できるインデックスを示します。
テーブル定義取得
SHOW CREATE TABLE ${テーブル名}