mysql delete文 スロークエリ

原因
おそらくwhereで指定しているカラムの絞り込み時、に時間がかかっていた。
参考:【SQL】DELETE文が遅いときのチューニング方法 | SE日記.

スロークエリの時の状態. このような状態でupdated_atをwhereの条件としていて、件数が多い、updated_atにインデックスがないのが原因と考えられる。

delete from テーブル名 where updated_at < '特定の日付';

なので、プライマリーキーであるidをwhereの条件として指定する. プライマリキーは作られた時点で一意制約なので、計算量としてももっとも早い. 改善版.

delete from テーブル名 where id in (idのリスト);

共有ブランチで操作せずにマージ済みのコミットを取り消したい

・マージ済みのブランチを一旦戻したい
・マージを取り消すだけで、後々にまた(ほぼ)同じ内容をマージする
・同じブランチ名を使いたい
・共有ブランチは基本、マージ&プッシュのみしかしてはいけないと教わった
・git revertを何回も繰り返す可能性がある(revert revert みたいになるとややこしくなる)

上記のような状況になった時、自分なりに対応したことを綴ります。
間違っているところがあるかもしれません。

使うのはgit revertとgit cherry-pickです。

  1. 変更のあるブランチで戻したいコミットをrevertする
  2. masterブランチで1でrevert済みのブランチをマージする (ここで戻る)
  3. 新しくブランチを切る
  4. revertしたブランチと同じ内容を残しておきたいので、cherry-pickでコミットする
  5. 同じブランチ名を使いたいなら、元のブランチを削除する(ローカル、リモート)
  6. 新しく作ったブランチを元のブランチ名にする

fuelphp バリデーション 上書きする場合は run()の引数に書く

$val->run() 引数指定なしの場合は、$ _POSTの値が実行される

// 引数指定ない場合は、デフォルトで$ _POST入力が入る
if ($val->run())
{
    // バリデーションに成功した場合の処理
}
else
{
    // 失敗
}

// 入力配列が指定されると拡張および上書きされます
if ($val->run(array('username' => 'something')))

デフォルトの$_POST以外を使いたい配列のみ、引数に書けば大丈夫でした。

参考: Validation - クラス - FuelPHP ドキュメント

csvで足りないデータ をsqlで他テーブルから取得し、そのままconcatでinsert文を作る

・エクセルのデータでselect(1行目) ~ union all select(2行目以降) を大量に作る
・↑で作った、select文をsqlで実行
・↑をテーブルとし、joinして必要なデータを取得する。
・concat文で結合し、insert文を作る。

select concat('insert文を作る') from (
  select id,...
  union all select  id,...
  .....//繋げる
) excel_data ed
join users on ed.excel_user_id = users.id

先輩に助けられた日でした。

正規表現 バックトラック回数が多くてタイムアウトが発生していた。

原因

前後の空白を削除する処理を使うときに
いくつかのデータのみ、文中に全角スペースが連続で30文字程度以上あった時にタイムアウトが発生していた。

解決方法

直前の文字が1回以上繰り返す場合にマッチする「+」の部分を「++」に変更した。

バックトラックとは?「+」と「++」 の違いは?

普段使う「+」はできるだけ長いパターンにマッチしようと、一度マッチに失敗しても、
バックトラックして戻りながらパターンを探す感じ?
それと比べて、絶対最大量指定子である「++」は一度マッチすると、
その後マッチに失敗してもバックトラックをしないそう。なので、パフォーマンスが改善されると思った。(マッチさせたいパターンによりそう)

感想

バックトラックというのを初めて聞いた。
「++」に変更したことでタイムアウトは無くなった
まだ理解の途中であります。正規表現むずい。
参考記事等を見ながら理解していきます。

参考記事

パフォーマンスを意識して正規表現を書く - Shin x Blog

【PHP】マルチバイト(全角スペース等)対応のtrim処理 - Qiita

mysql union(結合)でselectした時に重複を消したい時は、エクセルの「重複を削除」で無事データ提出できた。

データ提出依頼

csvかエクセルファイルで抽出したデータを提出して欲しい

困っていたこと

sqlでunionを用いており、取得したデータに重複が起きていた。
sqlのみで、その重複を除くことが難しかった。

自分なりの解決方法

sqlで取得した重複しているデータをcsv出力
②↑で出力したcsvをエクセルで開く
③重複番号がある列を選択(自分の場合は、IDの重複を除きたかったので、IDの列の「A」を選択)
④↑を選択したまま、「重複を削除」をクリック
⑤列Aで比較し、重複を削除する。

感想

最終的なデータ提出がエクセルかcsvだったので、今回大丈夫だった。
自分の知識ではまだ無いが、union(結合)で取得した重複のあるデータをsqlで除くことができるのだろうか。

git追跡調査 削除されたor非表示になった箇所がいつそうなったのか知りたい

お客さん側から、変更されている箇所があるが、案件として進めた記憶がない。
なので、いつそうなったのか、他の課題と関連して誰かが非表示にしてしまったのかを原因調査してほしいとのこと

調査すること

削除されたコミットを探し、そこからブランチ名を特定し、関連の課題を見つける

今回調べた手順

①使われていたのが画像だったので、vscodeで調べる。
cssでのみ使われていた。
③↑で指定しているclass名を、下記のように検索

git log -p -S'文字列' 

④削除されている痕跡 コミットIDを確認
⑤コミットIDが含まれているリモートのブランチ名を下記のように探す

git branch -r --contains <↑で確認したコミットID>

⑥ブランチを一つずつ調べて、特定できた

感想

⑤のブランチ名を検索する時に、たくさん候補が出てきた(マージされてるブランチがあるので、それはそう)ので、一つだけを特定できるようにしたい。