MySQL
DO SLEEP
DO SLEEP(5) とかで5秒待てる、トランザクションの挙動確認とかで便利
SELECT SLEEP(5) でも良いけど結果は要らないので DO を使うと出力されなくて目にやさしい
AUTOCOMMIT 下で SELECT ... FOR UPDATE
いみない
Locking reads are only possible when autocommit is disabled (either by beginning transaction with START TRANSACTION or by setting autocommit to 0.
ギャップロックされた空間への INSERT
ギャップロックされた空間への INSERT はブロックされる
排他ロック
ギャップロック同士はブロックしない
互いに同じギャップをロックして INSERT しようとすると Deadlock する
テーブル名入れ替える
Innodb 統計情報
ざっくりの行数を確認するのに
SELECT * FROM mysql.innodb_table_stats
SELECT * FROM mysql.innodb_table_stats WHERE table_name = 'hoge'
golang で Duplicate entry エラーを判定
エラーを mysql.MySQLError に変換してエラーコードを見る
大抵の場合 message 見れば良いかもしれない
code:duplicate.go
if err != nil {
if mysqlErr, ok := err.(*mysql.MySQLError); ok {
if mysqlErr.Number === 1062 {
...
}
}
}
その他エラーコードはこちら
MessagePack のカラムを LIKE で SELECT する
SELECT * FROM table WHERE msgpack LIKE BINARY CONCAT('%key', UNHEX('a5'), 'value%)
A5 は MessagePack の str 型先頭の長さ情報
めんどい時は何かで pack したバイナリを hex で書き出して UNHEX でクエリに渡そう
show processlist
time の単位は秒
クエリ全部見る SHOW FULL PROCESSLIST\G
MAX_EXECUTION_TIME
クエリにコメント /*+ {OPTIMIZER_HINT} */ の形で書ける
SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM table ... なら 1000ms で諦める
user * grant 一覧
code:all_grantree.sql
SELECT GRANTEE, GROUP_CONCAT(PRIVILEGE_TYPE ORDER BY PRIVILEGE_TYPE) FROM information_schema.user_privileges GROUP BY GRANTEE;
mysqldump に PROCESS 権限が必要になった
が、--no-tablespaces をつければ要らない
tablespace は CREATE TABLESPACE で作るやつ、つかってない
pager
pager COMMAND
pager grep -v Sleep などして show processlist すると Sleep を除外して見れる
nopager
INFORMATION_SCHEMA から殺すクエリを特定する
SELECT * FROM information_schema.PROCESSLIST ORDERBY TIME;
id に PID
user に接続ユーザー
info カラムにクエリが入っている
WHERE info LIKE 'SELECT %なんとか' など
確実に参照系だけを/ トランザクション外のものを 選択する方法はない?
LOWER(info) NOT LIKE '%insert%' AND LOWER(info) NOT LIKE '%update%' AND LOWER(info) NOT LIKE '%delete%' などである程度は...
time は実行時間(秒)
command
INNODB_TRX