MYSQLが遅かったとき、原因究明のため調べたこと

MYSQLが遅かったとき、原因究明のため調べたこと

ターミナルでMYSQLに接続して・・・

1.show processlistでQUERYの実行時間を調べる

2.innodb_thread_concurrencyを確認
InnoDB の処理を同時に実行できるスレッド数の上限値

コマンド
-------------------------------
show variables like '%thread%'
-------------------------------
上限なしの0なので問題なし

3.max_connectionsを確認
max_connectionsは同時接続数の最大値

コマンド
-------------------------------
show variables like '%conection%'
-------------------------------
151と出たので問題なし

4.mysqladminコマンドでMySQLサーバの状態を調べる

ディレクトリ移動(xamppの場合)
-------------------------------
C:\xampp\mysql\bin
-------------------------------

コマンド(パスワードなし)
-------------------------------
mysqladmin status
-------------------------------

コマンド(パスワードあり、xamppの場合)
-------------------------------
mysqladmin status -u ユーザー名 -p
-------------------------------

詳しく見る場合
-------------------------------
mysqladmin mysqladmin extended-status
-------------------------------

こちらを参考にした

エラーが出てることに気づいたので、
-------------------------------
lock wait timeout exceeded; try restarting transaction
-------------------------------

ロックの待ち時間を確認してみる。

コマンド
-------------------------------
show variables like '%timeout%'
-------------------------------

innodb_lock_wait_timeoutが50秒であることを確認。

この件は、テーブルにインデックスをつけることで問題は解決した。
こちら

ただの覚書でした。

【mysql】テーブルにインデックスを追加する方法

mysqlで、既存のテーブルにインデックスを追加する方法

------------------------------------------------
CREATE INDEX インデックス名 ON テーブル名(フィールド名);
------------------------------------------------

もしくは、
------------------------------------------------
ALTER TABLE テーブル名 ADD INDEX インデックス名(フィールド名);
------------------------------------------------

インデックス名は下記のように省略可。
------------------------------------------------
ALTER TABLE テーブル名 ADD INDEX (フィールド名);
------------------------------------------------
この場合、インデックスのフィールド名がそのままインデックス名となる。

TEXT型など一部の型にインデックスの追加を試みると、エラーになる場合がある。

エラーメッセージ
------------------------------------------------
BLOB/TEXT column 'text_field' used in key specification without a key length
------------------------------------------------

対処法。適当にキー長を明示する。
------------------------------------------------
ALTER TABLE テーブル名 ADD INDEX インデックス名(フィールド名(100));
------------------------------------------------

最後にインデックスできてるかを確認。

確認コマンド
------------------------------------------------
show index from テーブル名
------------------------------------------------

UWSCでウインドウを整列させる

UWSCでウインドウを整列させるサンプルコード

ウインドウを上下に並べる
-------------------------------------------------
objShell = CreateoleObj("Shell.Application")
objShell.TileHorizontally
-------------------------------------------------

ウインドウを左右に並べる
-------------------------------------------------
objShell = CreateoleObj("Shell.Application")
objShell.TileVertically
-------------------------------------------------

ウインドウを重ねる
-------------------------------------------------
objShell = CreateoleObj("Shell.Application")
objShell.CascadeWindows
-------------------------------------------------

ウインドウを最小化
-------------------------------------------------
objShell = CreateoleObj("Shell.Application")
objShell.MinimizeAll
-------------------------------------------------

【MYSQL+PHP】トランザクション処理のサンプルコード

MYSQL + PHPでトランザクションを行うための記述例

トランザクションのサンプルコード
///////////////////////////////////////////////////////////////
//通常は、自動コミットが有効になっているのでクエリ入力後、すぐにコミット(データベースの更新処理)が行われる。
//トランザクション処理を行うため「SET AUTOCOMMIT=0」で自動コミットを無効する。

mysql_query("SET AUTOCOMMIT = 0"); //オートコミットを無効にする
mysql_query("begin"); //トランザクション開始

//----この間に複数の処理を記述----------------------------------

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理1
mysql_query($up_sql1) OR die(mysql_error());

$sql2 = "DELETE FROM テーブル名2 WHERE ~" //処理2
mysql_query($up_sql2) OR die(mysql_error());

//----この間に複数の処理を記述 ここまで-------------------------


mysql_query("commit"); //ここで上記二つの処理が同時に実行される

///////////////////////////////////////////////////////////////

//commitがないので絶対にテーブルは更新されないサンプルコード
///////////////////////////////////////////////////////////////

mysql_query("SET AUTOCOMMIT = 0");
mysql_query("begin"); //トランザクション開始

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理1
mysql_query($up_sql1) OR die(mysql_error());

$sql2 = "DELETE FROM テーブル名2 WHERE ~" //処理2
mysql_query($up_sql2) OR die(mysql_error());

mysql_query("rollback"); //ロールバックなので実行されない

///////////////////////////////////////////////////////////////

※仮にロールバックがなくても、コミットせずに接続を閉じても、MySQLはそのトランザクションをロールバックするよう。

コミットとロールバックを細かく振り分けるなら、次のような記述ができる。

コミットとロールバックを振り分けるサンプルコード
///////////////////////////////////////////////////////////////

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理

$result = mysql_query($sql1);

if( $result === true ){

mysql_query("commit"); //確定
print "コミットしました";

}else{

mysql_query("rollback"); //巻き戻し
print "ロールバックしました";

}
///////////////////////////////////////////////////////////////

【mysql】重複したレコードのデータを取り出す

重複したレコードのデータを取り出すには、GROUP BY とHAVINGを使えばいい。

サンプルコード
----------------------------------------------------
SELECT カラム名 FROM テーブル名 GROUP BY カラム名 HAVING COUNT(*) >= 2;
----------------------------------------------------

HAVING句はグループ化が行われたデータに対して、条件を指定してデータの絞込みができる。サンプルコードでは、グループ化に指定したカラム名のうち、2つ以上あるものを取り出している。

※WHERE句とGROUP BY句を一緒に使った場合は、まずWHERE句よって条件に合うデータを抽出されて、その結果に対しGROUP BY句によってグループ化が行われる。HAVING句の場合と順序が逆なるということ。
※HAVEは捕まえる、選び取るの意。

複数のカラムが重複したレコードを取り出すサンプルコード
----------------------------------------------------
SELECT カラム名 FROM テーブル名 GROUP BY カラム名1,カラム名2 HAVING COUNT(*) >= 2;
----------------------------------------------------

HTMLにMP3を埋め込みブラウザで音声ファイルを再生する

HTMLにMP3を埋め込んでブラウザで再生するには、audio要素をJavaScriptから操作すればいい。

ボタンクリックでMP3が再生するサンプルコード
------------------------------------------
<html>
<head>
<script language="JavaScript"><!--
function playSound() {
document.getElementById('audio').play();

}
// --></script>

<audio id="audio">
<source src="sound.mp3" type="audio/mp3">
</audio>

<input type="button" value="再生" onclick="playSound()">

</body>
</html>
------------------------------------------

リンククリックで再生バージョンしたい場合は、再生ボタンを次のように書き換える
------------------------------------------
<a href="javascript:playSound()">再生</a>
------------------------------------------

【UWSC】localhostでIEの状態取得するとCOMエラー

Windows7インストールしたapacheで、ローカルホストにPHPファイルを置いた。
それをUWSCで操作しようとしたらCOMエラーが発生した。

COMエラーが発生したUWSCのスクリプト
-----------------------------------------

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://localhost/index.php")
BUSYWAIT(IE)
-----------------------------------------

BUSYWAITの部分でCOMエラーが発生。
下記のように書き直せすことでエラーは出なくなった。

エラーの出ないUWSCスクリプト
-----------------------------------------

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://127.0.0.1/index.php")
BUSYWAIT(IE)
-----------------------------------------

URLをIPアドレスに替えてやればエラーは発生しない。

UWSCでファイルをリネームして保存する

UWSCでファイルをリネームしたときの覚書

----------------------------------------
CMD = "CD " + GET_CUR_DIR //カレントディレクトリに移動

DOSCMD(CMD)

CMD = "ren 変更前ファイル名 変更後ファイル名"

DOSCMD(CMD)
----------------------------------------

ファイル名に半角スペースを含む場合はダブルクォートで囲む
----------------------------------------
CMD = "ren <#DBL>変更前 ファイル名<#DBL> <#DBL>変更後 ファイル名<#DBL>"
----------------------------------------

リネーム前のファイルを残す場合はコピーする
----------------------------------------
CMD = "copy 変更前ファイル名 after_copy\変更後 ファイル名"
----------------------------------------
※after_copyフォルダにリネーム後の保存先にした場合

PHPで一秒ごとにカウントを出力する【進捗表示】

PHPで進行状況をその都度出力したかったので、テストコードを書いた。

毎秒カウントアップ表示するサンプルコード
------------------------------------------

<?php

for ($i = 0; $i < 10; $i++) { echo $i; sleep(1); } ?> ------------------------------------------ これで1秒ごとにカウントして経過時間が表示されるはず。 そう思ったがうまくいかない。 調べてみると、PHPは出力のバッファリングがオンになっていることが多く、先ほどのようなスクリプトを実行しても毎秒ごとに出力してくれないらしい。 その都度出力は行われず、 代わりに内部バッファに保存される。そして後でまとめて表示される。ループのたびに出力するには「ob_end_flush()」でバッファリングをオフにすればいい。 先ほどのコードを修正 ------------------------------------------ <?php echo str_pad('',4096)."\n"; //←空文字を送る ob_end_flush(); //バッファリングをオフ for ($i = 0; $i < 10; $i++) { echo $i; flush(); // ← フラッシュする sleep(1); } ?> ------------------------------------------ テスト表示のとき意外と重要なのが「str_pad('',4096)」の部分。 多くのブラウザは、ある程度の文字列をバッファしてから表示を開始するため、ob_flush() や flush() によって、出力バッファをフラッシュしても、ブラウザのバッファに蓄積されてしまい、表示されない。 そこで、空白文字列をあらかじめ送るで、この問題を回避している。 これでもうまくいかないときは、PHP以外の何かがバッファリングを行っている疑いがある。 打開策のひとつとして、.htaccessに次の記述をする ------------------------------------------ mod_gzip_on Off ------------------------------------------ レンタルサーバ等の設定によっては、HTTPの応答がmod_gzipにより圧縮されることがあるのでOFFにする。

PHPの正規表現を実行するとApacheが落ちる

windows7 64bitにインストールしたxamppのPHPにて。

特定のページを読み込もうとするとと読み込み途中で「ページが見つかりません」エラーが出る現象に遭遇。

xamppのコントロールパネルからapacheのエラーログを見る。

エラーメッセージ
----------------------------------------------
ri Feb 07 02:21:38.898457 2014] [mpm_winnt:notice] [pid 3540:tid 248] AH00428: Parent: child process 10068 exited with status 3221225725 -- Restarting.
----------------------------------------------

よくわからないが再起動している。

原因を探っていくとPHPのpreg_match_all()の実行時に問題が起こっているようで、この問題はApacheのスタックサイズが足りなくなるのが発端のよう。

スタックメモリーとは、
----------------------------------------------
そのタスクや関数内だけで使われる変数やアドレス情報なんかを置いておくためのメモリ領域だ。タスクを終了する、または関数から抜けると、スタックの内容も破棄される。
----------------------------------------------

らしい。こちらより

で、このスタックサイズを増やすには、editbinコマンドを実行すればよくて、ただ実行するにはVisual Studioに入っているeditbin.exe(Microsoft COFF Binary File Editor)が必要とのこと。

「Visual Studio Express 2012 for Windows Desktop」をダウンロード。こちら
(最新版はVisual Studio2013だったが、マイクロソフトのアカウントを作ってサインインしろと、面倒くさそうだったので手間のない前ののバージョンにした)

インストールして目的のツールを確認

editbin.exeがあるフォルダのパス
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
----------------------------------------------

まず、現状のメモリサイズを確認する。
xamppのapacheフォルダ内にあるhttpd.exeをeditbin.exeのあるフォルダにいれる。cdでその場所まで移動してコマンドを実行。

----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>dumpbin /headers httpd.exe
----------------------------------------------

エラーが出た。
----------------------------------------------
コンピューターにmspdb110.dllがないため、プログラムを開始できません
----------------------------------------------

環境変数を反映させればなくなるエラーらしく、同じフォルダにある「vcvars32.bat」を実行。

----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>vcvars32.bat
----------------------------------------------

その後先ほどのコマンドを再び実行。
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>dumpbin /headers httpd.exe
----------------------------------------------

たくさん表示される情報の中、
「OPTIONAL HEADER VALUES」の見出し中に該当の項目を発見

「40000 size of stack reserve」

「40000」は16進法であり、10進数にすると262144 (256×1024) → 256k

根拠はないが、4倍に増やせば十分かと「1048576」と指定してeditbinを実行。
(式: 目的のメモリ数(単位はKbyte)×1024。今回は1024×1024。)

----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>editbin /stack:1048576 httpd.exe
----------------------------------------------

エラーがでる。
----------------------------------------------
LINK : fatal error LNK1104: ファイル 'httpd.exe' を開くことができません。
----------------------------------------------

どうも権限の都合でフォルダ内のファイルは変更できないらしい。
httpd.exeをデスクトップに移動させて再び実行する。
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>editbin /stack:1048576 C:\Users\PC名\Desktop\httpd.exe
----------------------------------------------

エラーは出ず。「dumpbin」でサイズ変更されていることを確認。

----------------------------------------------
100000 size of stack reserve
----------------------------------------------

PHPでApacheが落ちる問題も解消された。

参考にしたページ
こちらこちら